SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#26 30.09.2010 12:22:13

avgsoft
Завсегдатай
Зарегистрирован: 23.09.2010
Сообщений: 36

Re: Запрос с GROUP BY

mihim написал:

paulus, в EXPLAIN все красиво, но хоть убейте меня, скорость работы варианта с подзапросом выше в 3 раза. На 130 000 записей в vacancies и 25 городах -  0,07 против 0,19 сек smile В теории с подзапросом должно работать медленнее, но на практике всё иначе...

я в это верю :-) больше того, это вполне объяснимо.
в данном случае, подзапрос исполняется один раз, отсюда и выигрыш по времени исполнения. Оптимизатор считает подзапрос константным(его результаты не зависят от данных из внешнего запроса) и выполняет его один раз, а потом уже исполняет join.

Как раз Ваш, paulus, последний запрос, считает count на каждую выбранную строку из towns и explain к сожалению этого не покажет.  красивый explain - не залог оптимальной работы. :-)

Неактивен

 

#27 30.09.2010 13:49:22

mihim
Участник
Зарегистрирован: 23.09.2010
Сообщений: 10

Re: Запрос с GROUP BY

Вот и ладненько smile Буду пользоваться вариантом с подзапросом.
paulus, avgsoft еще раз спасибо за помощь!

Неактивен

 

#28 30.09.2010 14:45:46

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Запрос с GROUP BY

Хм, avgsoft, объясните тогда, пожалуйста, чем отличается способ
«посчитать count(*) каждый раз для одного элемента по ключу» (без подзапроса)
от «посчитать count(*) один раз для всех элементов» (с подзапросом)?

Неактивен

 

#29 30.09.2010 15:02:02

avgsoft
Завсегдатай
Зарегистрирован: 23.09.2010
Сообщений: 36

Re: Запрос с GROUP BY

работы меньше исполняется. что то вроде "оптом дешевле" :-)

Неактивен

 

#30 30.09.2010 15:12:12

avgsoft
Завсегдатай
Зарегистрирован: 23.09.2010
Сообщений: 36

Re: Запрос с GROUP BY

«посчитать count(*) каждый раз для одного элемента по ключу» - позиционируемся по ключу на нужный узел, считаем.
«посчитать count(*) один раз для всех элементов» - читаем данные из индекса, для каждого узла считаем.
нужна вся таблица, то есть при любом варианте, нужны все данные, хранящиеся в индексе. в вариант "count(*) один раз" работы исполняется меньше.

согласен, подзапрос тоже обладает рядом недостатков, но я пытался объяснить почему в данном случае подзапрос работает лучше.

Неактивен

 

#31 30.09.2010 16:04:20

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Запрос с GROUP BY

Я не понимаю, почему подзапрос работает лучше, правда. Спуск по индексу —
мгновенная операция. Учитывая, что в целевой таблице городов всего 25 —
это не влияет на производительность.

Неактивен

 

#32 30.09.2010 17:11:32

avgsoft
Завсегдатай
Зарегистрирован: 23.09.2010
Сообщений: 36

Re: Запрос с GROUP BY

ну не настолько мгновенная.
да и ещё один вариант: count(имя_поля) считает количество не-NULL значений в указанной колонке, в отличие от count(*) . это тоже может давать отставание по времени исполнения.

Неактивен

 

#33 30.09.2010 17:25:52

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Запрос с GROUP BY

Ну что значит не мгновенная? Если я могу взять, например, 20к строк/с по индексу,
это означает, что задержка не более 1/20k секунды. Мой калькулятор говорит, что
даже если городов 100, это вносит доп. время 0.005 секунды.

Может, я просто зажрался на быстрых процессорах? sad

Неактивен

 

Board footer

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