Последнее изменение: ORDER BY timestamp DESC LIMIT 1 - Эффективно? - PullRequest
1 голос
/ 22 июня 2011

У меня есть простой журнал сохранения:

XiD (INT) what was saved  
UiD (INT) who done it  
TiD (TIMESTAMP) CURRENT_TIMESTAMP  

Со всеми тремя полями в первичном ключе - чтобы сделать его уникальным.

Я хочу информировать пользователя только о последнихlog-line (до тех пор, пока она не попросит больше):

SELECT UiD,TiD FROM log WHERE XiD=? ORDER BY TiD DESC LIMIT 1  

Но что произойдет, если существует миллиард записей с одинаковым XiD?
Эффективно ли вышеприведенное или MySql-сервер проверит всезаписи (для ORDER BY)
- И если так: как извлечь одну из последних записей журнала, используя наименьшее количество калорий на сервере?

PS: я еще ничего не реализовал, поэтому возможна любая альтернативная схема:)

РЕДАКТИРОВАТЬ:
Возможно, было бы эффективнее просто хранить (перезаписывать), кто и когда (UiD+ TiD) непосредственно в полях XiD-записи (кроме журнала), поэтому я могу получить их напрямую, просматривая журнал, только когда пользователь явно запрашивает дополнительные строки журнала.

Ответы [ 3 ]

2 голосов
/ 22 июня 2011
  1. Нет, двигатель не проверит все записи для ORDER BY. Он проверит все эти записи, возвращенные предложением WHERE. Извините, пропустил это Но что произойдет, если миллиард записей с таким же XiD? . Да, движок проверит все записи для предложения ORDER BY. Вот порядок операций, как объяснил Бен Надель :

    1. ОТ предложения
    2. ГДЕ предложение
    3. Предложение GROUP BY
    4. HAVING пункт
    5. предложение SELECT
    6. ORDER BY пункт
  2. ИМХО, я не думаю, что может быть лучший способ извлечь единственную последнюю запись.

1 голос
/ 22 июня 2011

Для этого нужен индекс XiD ASC, TiD DESC. Поскольку UiD находится не в предложении where запроса, а TiD идет после UiD в индексе, его нельзя использовать для сортировки (что указано в файле sortort в результатах запроса объяснения)

0 голосов
/ 22 июня 2011

, если ваши столбцы 'XID' имеют '* AUTO_INCREMENT *' U, вы можете использовать:

SELECT UiD,TiD FROM log WHERE XiD=LAST_INSERT_ID() ORDER BY TiD DESC LIMIT 1

ref: MySQL Manual

...