SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 05.01.2011 17:22:56

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

Выполнение запроса

Чё-то не пойму, эксплейн показывает не много рядов

http://neval.name/explain.jpg

а сам запрос выполняется 2 минуты :\ В чём подвох? Неужели ветвление и преобразование дат на столько тормозит?


SELECT SQL_CALC_FOUND_ROWS `sms`.`id` , `sms`.`numbers` , COUNT( IF( `sms_numbers`.`status`
IN (
'DELIVRD', 'SENDED', 'ACCEPTD', 'ENROUTE'
), NULL , 1 ) ) AS `undelivered` , `sms`.`full_cost` , `sms`.`sign` , `sms`.`text` , DATE_FORMAT( `sms`.`added` , '%d.%m.%Y %H:%i' ) AS `added` , `sms`.`type`
FROM `sms`
JOIN `sms_numbers` ON `sms_numbers`.`sms_id` = `sms`.`id`
WHERE `sms`.`user_id` = '99999'
GROUP BY `sms`.`id`
ORDER BY `sms`.`added` DESC
LIMIT 0 , 30
 


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

Неактивен

 

#2 05.01.2011 17:41:09

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

Re: Выполнение запроса

А сколько будет выполняться без GROUP BY и/или без JOIN?

Так как здесь LIMIT 0,30, то имеет смысл сначала сделать

SELECT `sms`.`id` FROM `sms` WHERE `sms`.`user_id` = '99999' ORDER BY `sms`.`added` DESC LIMIT 0 , 30

а затем исходный запрос, но WHERE `sms`.`id` IN (12122,12331,31311,31321,4312,24363,643436,...) для тридцати выбранных записей.

Таким образом экономим на полной группировке и сортировке.

Неактивен

 

#3 05.01.2011 17:51:15

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

Re: Выполнение запроса

Да, были мысли разделить запросы... Просто глядя на эксплейн, не могу понять разногласий.. Смысл тогда на него ориентироваться, если эти цифры не многое решают?))
Без группировки запрос отработал за 20 секунд, но вернулась только одна запись почему-то. Без джоина можно и не пробовать, менее секунды будет стабильно smile

Значит будем разделять запрос...


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

Неактивен

 

#4 05.01.2011 18:09:21

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

Re: Выполнение запроса

Без группировки, но с COUNT делается группировка всего. Судя по EXPLAIN 7000 записей - в принципе не очень много, но нужно учитывать, что они включают и полный текст sms повторенный по 8 раз. Все это сортируется, а потом группируется. Странно, что две минуты, конечно. Сколько записей без GROUP BY и без COUNT?

Неактивен

 

#5 05.01.2011 18:26:56

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

Re: Выполнение запроса

rgbeast написал:

Без группировки, но с COUNT делается группировка всего.

Ага, точно.

rgbeast написал:

Сколько записей без GROUP BY и без COUNT?

Эмммм... вообще-то несколько миллионов smile Т.е. получается, сначала селектятся/группируются/считаются все данные, а только потом отбирается нужное количестов по LIMIT? Вполне логично, только я об этом почему-то не подумал даже, блин))


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

Неактивен

 

Board footer

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