SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 20.03.2008 12:22:17

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Скорость работы DISTINCT и GROUP BY

Как-то на практике замечал, что GROUP BY работает быстрее, чем DISTINCT, но всё же такие запросы достаточно медленны. Можно ли как-то ускорить их? Я так понимаю, что индексы они не используют, или только у меня не используют smile
Подскажите плз выход.


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#2 20.03.2008 20:53:42

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Скорость работы DISTINCT и GROUP BY

DISTINCT, согласно описанию, выполняет неявный GROUP BY. Отличие в производительности может быть, но объяснить его рационально сложно. Индексы использует, но нужны правильные составные индексы, так как GROUP BY выполняется после WHERE. Поясню примером:

SELECT * from x WHERE y=10 GROUP BY z;

Требует индекс KEY(y,z)

Если индекса нет правильного, а есть только KEY(z), то использовать его не имеет смысла, так как придется накладывать на него условие y=10, а это в лучшем случае MERGE индексов, а в худшем, перебор таблицы.

Неактивен

 

#3 21.03.2008 09:34:22

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Скорость работы DISTINCT и GROUP BY

А если в условии WHERE используется несколько полей, то индекса KEY(y,z) будет достаточно, если условие y=10 будет на первом месте? Или же нужен составной индекс на все поля?

Я так понимаю, что поле группировки в составном индексе должно быть последним?


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#4 21.03.2008 12:19:17

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Скорость работы DISTINCT и GROUP BY

Запрос:
SELECT * from x WHERE y1=10 AND y2=10 GROUP BY z;

Требует индекс KEY(y1,y2,z)

Идея в том, чтобы использовать только один ключ, если его использование обрывается в последовательности операций, выполняемых MySQL, то далее без ключей
Еще есть тема про составные индексы: http://sqlinfo.ru/forum/viewtopic.php?id=151

Кроме того, условие типа > или < обычно является последним, использующим индекс

Неактивен

 

#5 21.03.2008 13:30:04

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Скорость работы DISTINCT и GROUP BY

Не совсем понял smile
Если у меня условие идёт по 10 полям, а группировка по одиннадцатому, которое не участвует в условии, для использования индекса при группировке нужен индекс на все 11 полей? smile


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#6 21.03.2008 13:37:13

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Скорость работы DISTINCT и GROUP BY

Именно так. MySQL сначала накладывает WHERE, затем группирует. Индекс может использоваться только один (за редким исключением ситуаций с MERGE индексов), соответственно последовательность в нем должна соответствовать последовательности использования - сначала 10 полей WHERE, затем 1 поле GROUP BY. Использование индекса остановится, если среди WHERE есть условия < или >

Неактивен

 

#7 21.03.2008 14:07:07

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Скорость работы DISTINCT и GROUP BY

Вот использование < и > тоже интересно... Получается, при их использовании, значения не берутся из индекса и ускорить выборку уже никак нельзя?
В моих запросах есть и <, и >, и группировка. Значит, как я понимаю, включение поля группировки в использующийся индекс не имеет смысла?
Также, получается, что нет смысла включать в индекс поля, которые ищутся по условиям < и/или >? И тем более если таких полей несколько smile


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#8 21.03.2008 14:08:56

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Скорость работы DISTINCT и GROUP BY

Вот, к примеру, поле даты. Нужно найти записи, удовлетворяющие диапазону дат. Используем `date`>='date1' AND `date`<='date2'. Значит поле `date` не имеет смысла включать в индекс?


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#9 21.03.2008 14:22:06

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Скорость работы DISTINCT и GROUP BY

Neval написал:

Вот, к примеру, поле даты. Нужно найти записи, удовлетворяющие диапазону дат. Используем `date`>='date1' AND `date`<='date2'. Значит поле `date` не имеет смысла включать в индекс?

Это не так. Индекс используется для такого запроса. Но это последняя часть использованного составного индекса.

Пусть у Вас запрос WHERE a>10 and a<20 and b=11 and c=20
и индекс KEY(c,b, a) в таком случае последовательность такая:
1. Используется c=20 - первая часть индекса
2. Используется b=11 - вторая часть индекса
3. используется третья часть индекса для a>10 and a<20

Другой пример: KEY(c,a,b)
1. Используется c=20 - первая часть индекса
2. используется вторая часть индекса для a>10 and a<20
3. для оставшихся записей используется b=11 (using where), так как проще уже перебрать сами записи, чем обходить все ветви индекса для c=20, 10<a<20 и находить в индекса записи с b=11

Неактивен

 

#10 21.03.2008 14:30:15

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Скорость работы DISTINCT и GROUP BY

Сразу не написал, но в моём случае в индексе есть два поля, каждое из которых ищется по больше/меньше, значит два этих поля точно нет смысла держать в индексе smile

А есть ли преимущество в использовании BETWEEN вместо больше/меньше?


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#11 21.03.2008 14:41:26

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Скорость работы DISTINCT и GROUP BY

BETWEEN синоним < >, преимущество не дает

Ваш случай просто проверьте, посмотрите что говорит EXPLAIN, какое значение key_len

Неактивен

 

#12 16.04.2013 22:09:00

jodam91
Участник
Зарегистрирован: 16.04.2013
Сообщений: 1

Re: Скорость работы DISTINCT и GROUP BY

тут описано простым языком http://spyvak.name/page/%D0%A0%D0%B0%D0 … 8-group-by

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson