Насколько я понимаю, MySQL не может использовать индекс для сортировки этого запроса.
MySQL может использовать индекс только в том случае, если он отсортирован так же, как ваш запрос. Допустим, ваши записи для (table_id,my_field)
равны
(1,1), (2,28), (3,14), (4,20)
Индекс на (my_field,table_id)
будет храниться так
(1,1), (14,3), (20,4), (28,2)
При выполнении запроса из вашего примера IN (для простоты мы скажем, что ваш ORDER BY - ASCending) , MySQL найдет
(1,1), (20,4), (28,2)
... в этом порядке. Независимо от того, что они должны будут отсортировать их в (1,1),(28,2),(20,4)
. Это сортировка файлов. Вот почему MySQL мог использовать этот индекс только в том случае, если запрос был ORDER BY my_field
или ORDER BY my_field, table_id
, потому что индекс уже в этом порядке. Именно поэтому он не может [в настоящее время в некоторых будущих версиях может быть разрешена сортировка составных индексов в смешанном порядке] используйте индекс, если вы смешиваете ASC и DESC. Индекс сортируется в ASC, ASC и независимо от того, каким образом вы его читаете, он не будет в правильном порядке.
Обратите внимание, что нет ничего плохого в "сортировке файлов" , это часть нормального выполнения запроса. На самом деле он также не использует файлы и должен быть очень быстрым.
Если вам нужно отсортировать тысячи строк, вы можете получить лучшие результаты, используя небольшую производную таблицу, особенно если каждая строка действительно большая (много полей, больших двоичных объектов и т. Д.)
SELECT t.*
FROM (
SELECT table_id FROM my_table WHERE my_field IN (1, 28, 20)
) tmp
JOIN my_table t USING (table_id)
ORDER BY t.table_id DESC
Вы обменяете файловую сортировку на производную таблицу. В некоторых случаях он может быть гораздо более производительным, а в других - чуть меньше. YMMV