Mysql: лучшая практика для получения последних записей - PullRequest
4 голосов
/ 10 сентября 2010

У меня острый вопрос о mysql ...

Идея здесь состоит в том, чтобы выбрать n последних записей из таблицы с фильтрацией по свойству (возможно, из другой таблицы).Это просто.

В этот момент вы хотите ответить:

let n = 10

SELECT *
  FROM huge_table
  JOIN another_table
       ON another_table.id = huge_table.another_table_id
       AND another_table.some_interesting_property
  ORDER BY huge_table.id DESC
  LIMIT 10

Без соединения все нормально, mysql читает индекс с конца и trow10 элементов, время выполнения незначительно. При объединении время выполнения становится зависимым от размера таблицы и во многих случаях не пренебрежимо мало. Объяснение гласит: «Использование где; Использование индекса; Использование временного; Использование сортировки файлов»

Документация MySQL (http://dev.mysql.com/doc/refman/5.1/en/order-by-optimization.html) гласит:

"Вы объединяете много таблиц, и столбцы в ORDER BY не все из первой непостоянной таблицы, котораяиспользуется для извлечения строк. (Это первая таблица в выводе EXPLAIN, которая не имеет константного типа соединения.) "

, объясняющая, почему MySQL не может использовать индекс для разрешения моего ORDER BY, предпочитаяогромная сортировка файлов ...

Мой вопрос: естественно ли использовать ORDER BY ... LIMIT 10 для получения последних предметов? Вы действительно делаете это, когда выбираете последние 10 карт в порядке возрастания карты?колода?Лично я просто выбираю 10 снизу ...

Я перепробовал много возможностей, но все закончилось, и я пришел к выводу, что я действительно быстро опрашиваю 10 первых элементов и медленно опрашиваю 10 последних причин предложения ORDER BY.

Может ли "Выбрать последние 10" действительно быстро?Где я не прав?

Ответы [ 3 ]

0 голосов
/ 19 ноября 2010

У меня проблемы с воспроизведением вашей ситуации.Использую ли я ASC или DESC с моим huge_table / another_table макетом, мои EXPLAIN с и время выполнения показывают приблизительно N прочитанные строки и логическое соединение.Какую версию MySQL вы используете?

Кроме того, из EXPLAIN doc указано, что Using index означает

Информация о столбце полученаиз таблицы, используя только информацию в дереве индексов без необходимости дополнительного поиска, чтобы прочитать фактическую строку

, что не соответствует тому факту, что вы делаете SELECT *, если только выиметь индекс, который охватывает всю вашу таблицу.

Возможно, вам следует показать свою схему, включая индексы, и вывод EXPLAIN.

0 голосов
/ 29 ноября 2010

С помощью объединения вы теперь ограничиваете ряды до «some_interesting_property», и идентификаторы в вашей огромный_таблице могут больше не быть последовательными ... Попробуйте индексировать для другой_таблицы (some_interesting_property, id), а также огромный_таблицы (another_table_id, id) и посмотрите если ваш EXPLAIN дает вам лучшие советы.

0 голосов
/ 10 сентября 2010

Хороший вопрос, я думаю, вы должны сделать заказ по столбцу, то есть с идентификатором DESC.
Это должно сработать.
http://dev.mysql.com/doc/refman/5.0/en/create-index.html

...