Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / ускорить запрос / 10 сообщений из 10, страница 1 из 1
30.11.2018, 18:56
    #39741237
tadeyiloda
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ускорить запрос
есть такой запрос
Код: sql
1.
SELECT COUNT(*) FROM (SELECT `order`.* FROM `order` LEFT JOIN `customer` ON `order`.`id_customer` = `customer`.`id` LEFT JOIN `product` ON `order`.`id` = `product`.`id_order` LEFT JOIN `shop` ON `order`.`shop_id` = `shop`.`id` LEFT JOIN `address_delivery` ON `order`.`id_address_delivery` = `address_delivery`.`id` LEFT JOIN `shop_group` ON `shop`.`group_id` = `shop_group`.`id` GROUP BY `order`.`id`) `c`


выполняется полсекунды
explain на картинке
все fk проверил, все есть
как можно ускорить?
добавлю что такой запрос(без count) выполняется гораздо быстрее
Код: sql
1.
SELECT `order`.* FROM `order` LEFT JOIN `customer` ON `order`.`id_customer` = `customer`.`id` LEFT JOIN `product` ON `order`.`id` = `product`.`id_order` LEFT JOIN `shop` ON `order`.`shop_id` = `shop`.`id` LEFT JOIN `address_delivery` ON `order`.`id_address_delivery` = `address_delivery`.`id` LEFT JOIN `shop_group` ON `shop`.`group_id` = `shop_group`.`id` GROUP BY `order`.`id`
...
Рейтинг: 0 / 0
30.11.2018, 22:47
    #39741324
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ускорить запрос
Приведённый запрос эквивалентен запросу
Код: sql
1.
2.
SELECT COUNT( DISTINCT `order`.`id` )
FROM `order` 
...
Рейтинг: 0 / 0
30.11.2018, 23:07
    #39741328
tadeyiloda
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ускорить запрос
а через базу можно оптимизировать?
или может подредактировать my.ini?
...
Рейтинг: 0 / 0
01.12.2018, 15:59
    #39741450
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ускорить запрос
tadeyilodaесть такой запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT COUNT(*) FROM 
(SELECT `order`.* FROM `order` 
LEFT JOIN `customer` ON `order`.`id_customer` = `customer`.`id` 
LEFT JOIN `product` ON `order`.`id` = `product`.`id_order` 
LEFT JOIN `shop` ON `order`.`shop_id` = `shop`.`id` 
LEFT JOIN `address_delivery` ON `order`.`id_address_delivery` = `address_delivery`.`id` 
LEFT JOIN `shop_group` ON `shop`.`group_id` = `shop_group`.`id` 
GROUP BY `order`.`id`) `c`



выполняется полсекунды
explain на картинке
все fk проверил, все есть
как можно ускорить?
добавлю что такой запрос(без count) выполняется гораздо быстрее
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT `order`.* 
FROM `order` 
LEFT JOIN `customer` ON `order`.`id_customer` = `customer`.`id` 
LEFT JOIN `product` ON `order`.`id` = `product`.`id_order` 
LEFT JOIN `shop` ON `order`.`shop_id` = `shop`.`id` 
LEFT JOIN `address_delivery` ON `order`.`id_address_delivery` = `address_delivery`.`id` 
LEFT JOIN `shop_group` ON `shop`.`group_id` = `shop_group`.`id` 
GROUP BY `order`.`id`

Отформатировал чуток запросы, чтобы вширь не расползались
...
Рейтинг: 0 / 0
01.12.2018, 16:00
    #39741451
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ускорить запрос
AkinaПриведённый запрос эквивалентен запросу
Код: sql
1.
2.
SELECT COUNT( DISTINCT `order`.`id` )
FROM `order` 

А если `order`.`id` является первичным ключом, то и DISTINCT не нужен.
Т.е. так:
Код: sql
1.
2.
SELECT COUNT(*)
FROM `order`
...
Рейтинг: 0 / 0
01.12.2018, 16:26
    #39741459
tadeyiloda
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ускорить запрос
внесу ясность-указанный запрос автогенерируется из orm
в процессе работы возможны добавления условий например
Код: sql
1.
WHERE `product`.`provider_id`='1' 


поэтому просто свернуть запрос не получится
Код: sql
1.
SELECT COUNT(*) FROM `order`


отсюда вопрос-как ускорить запрос без изменения самого запроса
...
Рейтинг: 0 / 0
02.12.2018, 14:24
    #39741663
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ускорить запрос
tadeyilodaавтогенерируется из ormТ.е. вы сначала сами себе создали проблемы, а потом думаете как их обойти?

tadeyilodaв процессе работы возможны добавления условий например
Код: sql
1.
WHERE `product`.`provider_id`='1' 

Но тогда LEFT в JOIN-е с таблицей product будет только мешать. Он не даст оптимизатору соединить таблицы в другом порядке, даже если это выгодней по статистике.

tadeyilodaкак ускорить запрос без изменения самого запросаСамый лучше способ ускорить что-то - не делать этого вовсе. Так и тут, вместо того, чтобы перелопачивать JOIN-ами тысячи записей, можно было бы этого не делать.

Если все данные находятся в памяти, то упор происходит в CPU. Тогда только менять CPU на более быстрый в расчете на ядро (т.к. MySQL не параллелит выполнение запросов по ядрам). Но это тупиковый путь, вряд ли улучшит время даже в пару раз.

Если в процессе создается временный файл на диске, то можно временный каталог разместить в оперативке.
Можно даже всю базу запихать в оперативку. Но на фоне правильного запроса это много усилий с копеечным результатом.
...
Рейтинг: 0 / 0
03.12.2018, 11:15
    #39741867
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ускорить запрос
tadeyiloda,

Так полсекунды -- это не так уж и много...

Ну и...

Код: sql
1.
2.
3.
4.
SELECT `order`.* 
 FROM `order` 
... 
 GROUP BY `order`.`id`




-- невалидный запрос, он может возвращать что угодно, и выполняться может как угодно.
Переписывай.

Не должно быть в запросе полей, которые не указаны в group by и не входят в агрегирующие функции.
...
Рейтинг: 0 / 0
03.12.2018, 11:16
    #39741868
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ускорить запрос
[quot tadeyiloda]внесу ясность-указанный запрос автогенерируется из orm


Также, выкидывай этот ORM, раз он генерирует неверные запросы.
...
Рейтинг: 0 / 0
03.12.2018, 11:20
    #39741871
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ускорить запрос
tadeyilodaкак ускорить запрос без изменения самого запросаВ данном случае - в принципе никак. Ибо тот самый дебильный подзапрос с кучей джойнов в секции FROM основного запроса обязан быть материализован - и именно этот процесс сжирает практически всё время.
tadeyilodaуказанный запрос автогенерируется из ormВыбросите это ORM, если оно генерирует такой бред.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / ускорить запрос / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]