Mysql Order by clause с использованием "FileSort"

У меня есть структура таблицы, например

comment_id primary key
comment_content 
comment_author
comment_author_url

Когда я запускаю запрос, например

explain SELECT * FROM comments  ORDER BY comment_id

Он выводит результаты как

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1   SIMPLE  comments    ALL     NULL    NULL    NULL    NULL    22563   Using filesort

Почему не удается найти индекс, который я определил как первичный ключ?

8
задан 12 авг. '12 в 11:51
источник поделиться
2 ответов

В любое время сортировка не может выполняться из индекса, его файлового массива.

Странная вещь заключается в том, что у вас должен быть индекс в этом поле, поскольку он является первичным ключом (а столбцы первичного ключа неявно индексируются), тестирование в тестовой базе данных я только заметил, что MySQL использует FileSort в любое время, когда вы выполняете SELECT *, это бессмысленное поведение (я знаю), но если вы переписываете свой запрос таким образом:

SELECT comment_id, comment_content, comment_author, comment_author_url 
FROM comments  
ORDER BY comment_id

он правильно использует индекс. Может быть, может быть ошибка mysql...

6
ответ дан 12 авг. '12 в 12:12
источник

Это не потому, что он не может использовать индекс. Это связано с тем, что оптимизатор считает, что быстрее не использовать индекс и делать fileort 1. Вы должны увидеть другое поведение в таблицах MyiSAM и InnoDB.

InnoDB создает ключ PRIMARY как кластерный (или первый UNIQUE, если первичный не определен), и это может использоваться для запросов с ORDER BY pk или WHERE pk BETWEEN low AND high, потому что все необходимые значения находятся в этот кластеризованный ключ и в последовательных местах (кластеризованный ключ ).

Таблицы MyISAM имеют только индексы B-tree, поэтому, если запрос использовал этот индекс, он должен был бы прочитать весь этот индекс, и он имел бы значения comment_id в желаемом порядке (это действительно хорошо), но тогда также прочитать таблицу (не очень хорошо), чтобы получить все другие нужные столбцы. Итак, оптимизатор думает, что, поскольку он собирается прочитать таблицу, почему бы не отсканировать все это и сделать filesort? Вы можете проверить это, попробовав:

SELECT comment_id FROM comments  ORDER BY comment_id ;

Он будет использовать индекс и не делать fileort, потому что для запроса нужны только значения, которые хранятся в индексе.


Если вам нужна аналогичная (для InnoDB) поведение в MyiSAM, вы попытаетесь создать индекс на (comment_id, comment_content, comment_author, comment_author_url), а затем попробуйте ваш запрос. Все необходимые значения будут найдены в индексе и в правильном порядке, поэтому никакие файлы не будут выполняться.

Дополнительный индекс потребуется, конечно, столько же места на диске, сколько и таблица.


1: filesort не всегда вреден, и это не означает, что файл сохраняется на диске. Если размер данных мал, он выполняется в памяти.

10
ответ дан 12 авг. '12 в 13:28
источник

Другие вопросы по меткам или Задайте вопрос