MySQL не использует индекс для ORDER BY

У меня есть индекс (column_1, column_2, column_3), и когда я запускаю этот запрос

SELECT * FROM table ORDER BY column_1 DESC, column_2 ASC, column_3 ASC

этот индекс не используется.

Мне нужно было бы использовать этот индекс, поскольку существует большая разница во времени запроса, когда я использую только ORDER BY column_1 DESC (около 0,0005 секунды) и ORDER BY column_1 DESC, column_2 ASC, column_3 ASC (около 0,4 секунды).

Кроме того, этот индекс даже не используется в ORDER BY column_1 DESC.

Это EXPLAIN для ORDER BY column_1 DESC, column_2 ASC, column_3 ASC, то же самое только для ORDER BY column_1 DESC:

MySQL не использует индекс для ORDER BY

Есть ли причина, по которой индекс не используется?

asc и desc имеют значение в индексе. Это не должно, но это так. И, к сожалению, MySQL исторически не поддерживал нисходящие индексы.
Gordon Linoff 28.05.2019 16:23

Какой это тип индекса? Сколько столбцов у вас в таблице?

M. Kanarkowski 28.05.2019 16:25

Индекс @ M.Kanarkowski - BTREE, у меня в этой таблице 11 столбцов, но это не имеет значения, если используется индекс?

user3566569 28.05.2019 16:27
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
3
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваше определение индекса должно соответствовать запрашиваемому порядку сортировки или, по крайней мере, смешанному направлению сортировки (то есть либо DESC, ASC, ASC, либо ASC, DESC, DESC). Документы ORDER BY говорят:

If a query mixes ASC and DESC, the optimizer can use an index on the columns if the index also uses corresponding mixed ascending and descending columns. [...] The optimizer can use an index on (key_part1, key_part2) if key_part1 is descending and key_part2 is ascending. It can also use an index on those columns (with a backward scan) if key_part1 is ascending and key_part2 is descending.

См. здесь для получения дополнительной информации.

Таким образом, решением было бы создать индекс (column_1 DESC, column_2, column_3)? Я сделал это, и это все еще не используется. Может быть, это потому, что эти столбцы новые и всего меньше 100 разных строк, поэтому механизм базы данных решил не использовать индекс?

user3566569 28.05.2019 18:14

Возможно, вам понадобится ANALYZE TABLE. Но да, оптимизатор сначала учитывает стоимость чтения индекса, а затем чтения строк, на которые индекс указывает Vs. просто читаю таблицу. Если индекс не считается полезным, он не используется. Если таблица (целая таблица?!) состоит всего из нескольких сотен строк, вся таблица, скорее всего, умещается в памяти, и польза от индекса для начала невелика.

user2722968 28.05.2019 20:27

Обратите внимание, что определение индексов с сочетанием столбцов ASC и DESC — это новая функция в MySQL 8.0. Объявление ASC и DESC в столбцах индекса игнорируется в более ранних версиях MySQL.

Bill Karwin 28.05.2019 20:40

@BillKarwin Тогда в этом проблема, у меня версия 5.6.41.

user3566569 28.05.2019 23:08

Да, в версии 5.6 вы можете объявить столбцы индекса как DESC, но они будут храниться только как ASC.

Bill Karwin 28.05.2019 23:11

Другие вопросы по теме