Порядок по столбцу должен иметь индекс или нет?


35

Я добавил в таблицу индексы, которые используются для поиска результата. Я показываю результаты по ASC или DESC заказу. Так что этот столбец должен иметь индекс или нет? У меня есть еще 2 индекса в этой таблице. Как производительность повлияет на создание или отсутствие индекса для этого столбца?


2
Пожалуйста,
отправьте

Ответы:


26

Да, MySQL может использовать индекс по столбцам в ORDER BY (при определенных условиях). Однако MySQL не может использовать индекс для смешанного ASC, порядок DESC ( SELECT * FROM foo ORDER BY bar ASC, pants DESC). Совместное использование вашего запроса и оператора CREATE TABLE поможет нам более конкретно ответить на ваш вопрос.

Советы по оптимизации предложений ORDER BY: http://dev.mysql.com/doc/refman/5.1/en/order-by-optimization.html.

Изменить 2012-01-21 8:53

Были вопросы об источнике моего заявления об использовании индекса со смешанным ASC / DESC в ORDER BY. Из документации по заказу BY :

В некоторых случаях MySQL не может использовать индексы для разрешения ORDER BY, хотя он все еще использует индексы для поиска строк, которые соответствуют предложению WHERE. Эти случаи включают в себя следующее:

...

Вы смешиваете ASC и DESC:

SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC;

...

Кроме того, ключевое слово DESC не имеет смысла в CREATE INDEX.

Спецификация index_col_name может заканчиваться ASC или DESC. Эти ключевые слова разрешены для будущих расширений для указания хранения значений индекса по возрастанию или по убыванию. В настоящее время они анализируются, но игнорируются; Значения индекса всегда хранятся в порядке возрастания.


3
Msgstr "MySQL не может использовать индекс для смешанных ASC, DESC" . Ссылка для этого?
ypercubeᵀᴹ

CREATE INDEX idx_foo ON foo(bar ASC, pants DESC);должно сработать.
Фрэнк Хейкенс

Мой источник - документация mysql, ссылка на которую есть в моем ответе. Ищите «микс».
Аарон Браун

3
MySQL анализирует asc & desc в CREATE INDEX, но игнорирует их. Индексы всегда хранятся в порядке возрастания. dev.mysql.com/doc/refman/5.5/en/create-index.html
Аарон Браун

1
Новый с MySQL 8.0 : Теперь можно использовать смесь , ASCи DESC еслиINDEX имеет ту же смесь.
Рик Джеймс

4

Для всех, кто интересуется ответом, связанным с PostgreSQL, ответ - да, будет использоваться индекс. В соответствии с документацией PostgreSQL планировщик запросов «рассмотрит соответствие спецификации ORDER BY либо путем сканирования доступного индекса, соответствующего спецификации, либо путем сканирования таблицы в физическом порядке и выполнения явной сортировки». Это означает, что если существует индекс, который может использовать планировщик, он сделает это, вернувшись к выполнению сортировки после получения соответствующих строк.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.