powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / оптимизировать запросы
2 сообщений из 2, страница 1 из 1
оптимизировать запросы
    #40097920
zizi_top
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
explain SELECT COUNT(order_id) AS `Order`, ROUND(SUM(amount), 2) AS `SumOrder`, DATE(`order_date`) AS `groupDate`, COUNT(CASE WHEN payment_status=1 THEN 1 END) AS `Status1`, SUM(CASE WHEN payment_status=1 THEN amount ELSE 0 END) AS `SumStatus1`, COUNT(CASE WHEN payment_status=2 THEN 1 END) AS `Status2`, SUM(CASE WHEN payment_status=2 THEN amount ELSE 0 END) AS `SumStatus2`, COUNT(CASE WHEN payment_status=3 THEN 1 END) AS `Status3`, SUM(CASE WHEN payment_status=3 THEN amount ELSE 0 END) AS `SumStatus3` FROM `orders` INNER JOIN `orders_status` ON orders.payment_status=orders_status.id WHERE (`orders`.`id` IN (SELECT `orders`.`id` FROM `orders` LEFT JOIN `paypal_account` ON `orders`.`paypal_account` = `paypal_account`.`paypal_account` LEFT JOIN `paypal_account_group` ON `paypal_account`.`paypal_group` = `paypal_account_group`.`id`)) AND (DATEDIFF(CURDATE(), order_date) <= 15) GROUP BY `groupDate` ORDER BY MIN(groupDate)


авторid select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY orders_status index PRIMARY PRIMARY 4 NULL 3 Using index; Using temporary; Using filesort
1 PRIMARY orders ref PRIMARY,payment_status payment_status 5 test.orders_status.id 109757 Using where
1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 func 1 NULL
2 MATERIALIZED orders index PRIMARY paypal_account 152 NULL 439030 Using index
2 MATERIALIZED paypal_account ref paypal_account paypal_account 152 test.orders.paypal_account 1 NULL
2 MATERIALIZED paypal_account_group eq_ref PRIMARY PRIMARY 4 test.paypal_account.paypal_group 1 Using where; Using index
выполняется 5 секунд

Код: sql
1.
explain SELECT COUNT(*) FROM `orders` LEFT JOIN `paypal_account` ON `orders`.`paypal_account` = `paypal_account`.`paypal_account` LEFT JOIN `paypal_account_group` ON `paypal_account`.`paypal_group` = `paypal_account_group`.`id`


авторid select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE orders index NULL paypal_account 152 NULL 439030 Using index
1 SIMPLE paypal_account ref paypal_account paypal_account 152 test.orders.paypal_account 1 NULL
выполняется 2 сек
...
Рейтинг: 0 / 0
оптимизировать запросы
    #40097928
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще мог бы и отформатировать...

Запрос 1.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SELECT COUNT(order_id) AS `Order`, 
       ROUND(SUM(amount), 2) AS `SumOrder`, 
       DATE(`order_date`) AS `groupDate`, 
       COUNT(CASE WHEN payment_status=1 THEN 1 END) AS `Status1`, 
       SUM(CASE WHEN payment_status=1 THEN amount ELSE 0 END) AS `SumStatus1`, 
       COUNT(CASE WHEN payment_status=2 THEN 1 END) AS `Status2`, 
       SUM(CASE WHEN payment_status=2 THEN amount ELSE 0 END) AS `SumStatus2`, 
       COUNT(CASE WHEN payment_status=3 THEN 1 END) AS `Status3`, 
       SUM(CASE WHEN payment_status=3 THEN amount ELSE 0 END) AS `SumStatus3` 
FROM `orders` 
INNER JOIN `orders_status` ON orders.payment_status=orders_status.id 
WHERE (`orders`.`id` IN (SELECT `orders`.`id` 
                         FROM `orders` 
                         LEFT JOIN `paypal_account` ON `orders`.`paypal_account` = `paypal_account`.`paypal_account` 
                         LEFT JOIN `paypal_account_group` ON `paypal_account`.`paypal_group` = `paypal_account_group`.`id`))
  AND (DATEDIFF(CURDATE(), order_date) <= 15) 
GROUP BY `groupDate` 
ORDER BY MIN(groupDate)



1) Подзапрос во WHERE удалить. Совсем. Потому что не имеет смысла - ему соответствуют все записи.
2) Второе условие переписать на order_date >= CURRENT_DATE - INTERVAL 15 DAY .
3) Проверить, что существуют индексы:
- orders(payment_status, order_date) и orders(order_date, payment_status) (посмотреть explain, оставить более подходящий);
- orders_status(id) (скорее всего он существует и первичный, но кто-то не озаботился публикацией структур таблиц).
4) Заменить ORDER BY MIN(groupDate) на ORDER BY groupDate - какой смысл брать минимум от одного значения?
5) Заменить COUNT(CASE WHEN payment_status=X THEN 1 END) на SUM(payment_status=X) - результат тот же, но на одну проверку меньше. Впрочем, это мелочь.

Запрос 2.
Код: sql
1.
2.
3.
4.
SELECT COUNT(*) 
FROM `orders` 
LEFT JOIN `paypal_account` ON `orders`.`paypal_account` = `paypal_account`.`paypal_account` 
LEFT JOIN `paypal_account_group` ON `paypal_account`.`paypal_group` = `paypal_account_group`.`id`


Ну тут кроме наличия соотв. индексов ничего не требуется. Формально.

Если же говорить о логике, то скорее всего `paypal_account`.`paypal_account` и `paypal_account_group`.`id` в своих таблицах уникальные поля - если это так, то оба LEFT JOIN вместе с таблицами удалить нахрен (если `paypal_account`.`paypal_account` не уникален, а `paypal_account_group`.`id` уникален - удалить только второй LEFT JOIN).
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / оптимизировать запросы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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