Индекс MySQL для группы по / упорядочить по - PullRequest
10 голосов
/ 19 сентября 2011

См. Запрос ниже. Какой индекс я должен создать для таблицы, чтобы запрос использовал индекс и не использовал временную и файловую сортировку? Я попробовал много разных комбинаций индексов и прочитал совет здесь , но, похоже, не могу понять это. Мое объяснение говорит либо Using Where (без индекса), либо Using Where Using Temporary, Using Filesort

Вот упрощенный запрос. Все столбцы являются целыми числами.

SELECT c1, Sum(c2) 
FROM table 
WHERE c3 IS NOT NULL 
AND c4 = 2011 
AND c5 = 0 
AND c6 In (6,9,11)  
GROUP BY c1

Ответы [ 3 ]

7 голосов
/ 20 сентября 2011

Это должно помочь вам.Перепишите запрос следующим образом:

SELECT c1, Sum(c2) 
FROM table 
WHERE c4 = 2011 
AND c5 = 0 
AND c6 In (6,9,11)
AND c3 IS NOT NULL   
GROUP BY c1

Теперь создайте составной индекс по столбцам (c4, c5, c6) со столбцами IN THAT ORDER.Столбцы в вашем индексе должны отображаться в том же порядке, что и столбцы в предложении WHERE.В противном случае индекс не будет работать.Избирательность этого индекса достаточно узка, поэтому сортировка файлов во временной таблице (для группы по) должна быть быстрой.

Причина перемещения c3 в конец запроса заключается в следующем.В качестве примера, давайте предположим, что c3 может принимать значения от 0 до 100 (или это может быть NULL).Если вы выполняете запрос «IS NOT NULL», Mysql должен пройти почти весь индекс B-Tree, кроме ребер, соответствующих NULL.Поэтому MySQL решает, что полное сканирование таблицы является более простым вариантом, чем обход всех различных путей в индексе.С другой стороны, вы увидите, что если ваш запрос был «IS NULL», а ваш индекс (c3, c4, c5, c6), то Mysql будет воздействовать на этот индекс.Это связано с тем, что в этом случае Mysql необходимо пройти только ту часть дерева индексов, которая соответствует значению NULL.

Тип индексов, в которых нуждается MySQL, очень сильно зависит от рассматриваемого запроса.Создание индексов для всех столбцов, как предположил @louis, НЕ является хорошей идеей!

0 голосов
/ 19 сентября 2011

Я полагаю, что проблема связана с пунктом 'ORDER BY 2 DESC'.Даже если индекс c2 индексируется, SUM (C2) - нет.

Относительно того, какие индексы вы «должны» иметь, это зависит от данных, поэтому я не могу комментировать.

0 голосов
/ 19 сентября 2011

По опыту я должен сказать: построить индексы для всех столбцов в предложении "где" (но здесь, а не c6)

По крайней мере, c4 и c5.

Группа "The"по предложению упорядочит результаты.Если у вас есть много записей в результате, это МОЖЕТ быть полезно для индексации c1.

c3 проверяется только как "не ноль".Но индексирование также может улучшить ситуацию, это нужно проверить.

Хопз, это было полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...