MySQL: индексы по GROUP BY - PullRequest
       2

MySQL: индексы по GROUP BY

2 голосов
/ 22 сентября 2011

У меня достаточно большая таблица (> 10.000 строк), которая будет расти намного быстрее. В этой таблице я запускаю следующий запрос:

SELECT *, MAX(a) FROM table GROUP BY b, c, d

В настоящее время EXPLAIN говорит мне, что нет ключей, нет возможных ключей, и это «Использование временного использования файловой сортировки» Каким будет лучший ключ для такого стола?

Ответы [ 3 ]

4 голосов
/ 22 сентября 2011

Как насчет составного ключа b+c+d+a?

Кстати, SELECT * не имеет смысла, если у вас есть GROUP BY

2 голосов
/ 22 сентября 2011

Первичный индекс для поля b, c, d был бы хорош, если применимо.
В этом случае вы просто делаете

SELECT * FROM table1 
group by <insert PRIMARY KEY here> 

Если не поставить индекс на b, c, d.
А может быть, зависит от производительности.

Если b, c, d всегда используются в унисон, используйте составной индекс для всех трех.

Очень важно!Всегда объявляйте первичный ключ.Без этого производительность на InnoDB будет отстойной.

Чтобы уточнить @zerkms, вам нужно только поместить те столбцы в группу group by, которые полностью определяют строки, которые вы выбираете.
Если вы select *, это может быть хорошо, но чемПараметр max (a) не требуется, также как и группировка по.
Также обратите внимание, что max(a) может происходить из строки, отличной от остальных полей.

Единственный вариант использования, который имеет смысл:

select t1.*, count(*) as occurrence from t1 
inner join t2 on (t1.id = t2.manytoone_id) 
group by t1.id

Где t1.id - это PK.

Я думаю, вам нужно переосмыслить этот запрос.
Задайте новый вопрос, объясняющий, что вы хотите с реальным кодом.
И обязательно задайте how to make the outcome определите , so that all values shown are functionally dependent on the group by clause.

1 голос
/ 22 сентября 2011

В итоге получилось изменить запрос следующим образом:

SELECT b, c, d, e, f, MAX(a) FROM table GROUP BY b, c, d

И создание индекса для (b, c, d, e, f).

Большое спасибо за вашу помощь: советы здесь были очень полезны.

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