powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация запроса
5 сообщений из 5, страница 1 из 1
Оптимизация запроса
    #39977229
ADMINCHIKKK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет
Помогите оптимизировать запрос. Пробую расставить индексы, но не помогает что-то, недоконца понимаю глядя на EXPLAIN что надо сделать.

Запрос такой:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
EXPLAIN
select *, (IFNULL(tbl2.summa_for_payed2, 0) + IFNULL(tbl3.balance3, 0) + IFNULL(tbl4.correct4, 0) + IFNULL(tbl6.summa_difference, 0)) AS TOTAL from
(select driver_id, name, active, bank, dailypay_ind from taxi_drivers where company_owners='0e897c0a3f48ae74a297b054eb333a26' and profile_owner='e4cbb175b88f6ecc2437fdf312aff5ed' ) tbl1
LEFT JOIN
(select driver_id as driver_id_tbl2, sum(summa_for_payed) AS summa_for_payed2, sum(summa_for_payed_company) AS summa_for_payed_company2 from taxi_profile_finance_f56c20d2026b4300ce00852caefa1d32 where payed_status='0' and date < '2020-07-07' group by driver_id) tbl2
ON tbl1.driver_id = tbl2.driver_id_tbl2
LEFT JOIN
(select driver_id as driver_id_tbl3, money as balance3 from taxi_balance) tbl3
ON tbl1.driver_id = tbl3.driver_id_tbl3
LEFT JOIN
(select driver_id as driver_id_tbl4, money as correct4 from taxi_correct) tbl4
ON tbl1.driver_id LIKE tbl4.driver_id_tbl4
LEFT JOIN
( select to_driver_id, comment from taxi_log group by to_driver_id ) tbl5
ON tbl1.driver_id LIKE tbl5.to_driver_id
LEFT JOIN
( select driver_id as driver_id_tbl6, sum(difference) as summa_difference, sum(difference_company) as summa_difference_company from taxi_difference where profile_id='f56c20d2026b4300ce00852caefa1d32' and date < '2020-07-07' group by driver_id ) tbl6
ON tbl1.driver_id LIKE tbl6.driver_id_tbl6
LEFT JOIN
( select date, driver_id as driver_id_tbl7, zalogovaya_plata from taxi_zalog ) tbl7
ON tbl1.driver_id LIKE tbl7.driver_id_tbl7
LEFT JOIN
( select driver_id as driver_id_tbl8, sum(summa) as summa_freezed, need_pay_1, min(need_pay_2) as need_pay_2 from taxi_balance_freeze group by driver_id_tbl8 ) tbl8
ON tbl1.driver_id = tbl8.driver_id_tbl8
ORDER BY tbl1.name



Вывод:
Скрин EXPLAIN - а

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

Вот этот <derived6> Это какая строка запроса?
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39977265
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неужели было так сложно отформатировать запрос, чтобы он нормально влезал в экран?

ADMINCHIKKK
Пробую расставить индексы, но не помогает что-то

Так ты своими руками убил навылет возможность использовать индексы для половины таблиц. Вот нахрена нужны подзапросы (tbl1, tbl3, tbl4, tbl7), в которых нет группировки? заменяй на прямое обращение к таблицам, а их WHERE переноси в основной запрос или в условия связывания (в зависимости от логики) - тогда и заработают индексы...

И внимательно пройди по типу связывания. Везде ли нужен именно LEFT JOIN? думаю, после анализа половина заменится на INNER JOIN, что ещё облегчит запрос.

ADMINCHIKKK
Вот этот <derived6> Это какая строка запроса?
Скрин не грузится (или неверный URL, или он удалён) - приложи его непосредственно к сообщению (а ещё лучше - скопипастить текстом и выложить в тегах кода). Но вообще derived - это "подзапрос".
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39977268
ADMINCHIKKK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Akina#22163753]Неужели было так сложно отформатировать запрос, чтобы он нормально влезал в экран?


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
+------+-------------+-------------------------------------------------------+--------+---------------+-----------+---------+-------------------------------------+--------+--------------------------------------------------------+
| id   | select_type | table                                                 | type   | possible_keys | key       | key_len | ref                                 | rows   | Extra                                                  |
+------+-------------+-------------------------------------------------------+--------+---------------+-----------+---------+-------------------------------------+--------+--------------------------------------------------------+
|    1 | PRIMARY     | taxi_drivers                                          | ALL    | NULL          | NULL      | NULL    | NULL                                |   9950 | Using where; Using temporary; Using filesort           |
|    1 | PRIMARY     | <derived3>                                            | ref    | key0          | key0      | 153     | yellow_test1.taxi_drivers.driver_id |     49 |                                                        |
|    1 | PRIMARY     | taxi_balance                                          | eq_ref | PRIMARY       | PRIMARY   | 152     | yellow_test1.taxi_drivers.driver_id |      1 |                                                        |
|    1 | PRIMARY     | taxi_correct                                          | ALL    | NULL          | NULL      | NULL    | NULL                                |    347 | Using where; Using join buffer (flat, BNL join)        |
|    1 | PRIMARY     | <derived6>                                            | ALL    | NULL          | NULL      | NULL    | NULL                                | 417777 | Using where; Using join buffer (incremental, BNL join) |
|    1 | PRIMARY     | <derived7>                                            | ALL    | NULL          | NULL      | NULL    | NULL                                |   2427 | Using where; Using join buffer (incremental, BNL join) |
|    1 | PRIMARY     | taxi_zalog                                            | ALL    | NULL          | NULL      | NULL    | NULL                                |   6768 | Using where; Using join buffer (incremental, BNL join) |
|    1 | PRIMARY     | <derived9>                                            | ref    | key0          | key0      | 153     | yellow_test1.taxi_drivers.driver_id |      3 |                                                        |
|    9 | DERIVED     | taxi_balance_freeze                                   | ALL    | NULL          | NULL      | NULL    | NULL                                |     36 | Using temporary; Using filesort                        |
|    7 | DERIVED     | taxi_difference                                       | index  | NULL          | driver_id | 153     | NULL                                |   2427 | Using where                                            |
|    6 | DERIVED     | taxi_log                                              | index  | NULL          | driver_id | 303     | NULL                                | 417777 |                                                        |
|    3 | DERIVED     | taxi_profile_finance_f56c20d2026b4300ce00852caefa1d32 | index  | NULL          | driver_id | 157     | NULL                                | 496071 | Using where                                            |
+------+-------------+-------------------------------------------------------+--------+---------------+-----------+---------+-------------------------------------+--------+--------------------------------------------------------+

авторВот нахрена нужны подзапросы (tbl1, tbl3, tbl4, tbl7), в которых нет группировки? заменяй на прямое обращение к таблицам, а их WHERE переноси в основной запрос или в условия связывания (в зависимости от логики) - тогда и заработают индексы... Иммешь ввиду не делать
Код: plsql
1.
2.
LEFT JOIN
(select driver_id as driver_id_tbl3, money as balance3 from taxi_balance) tbl3


а сразу так:
Код: plsql
1.
2.
LEFT JOIN
taxi_balance tbl3



автора их WHERE переноси в основной запрос или в условия связывания А разве если where будет в подзапросе, то не быстрее отработает? Разве не получится что уже после первого where дальше уже меньше будет строк для обработки? А так придётся всё это, весь это объём обрабатывать и только уже в конце выбрать то что надо? Или я не так что-то представляю?
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39977270
ADMINCHIKKK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Переформатировал запрос

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
EXPLAIN
SELECT *, (IFNULL(tbl2.summa_for_payed2, 0) + IFNULL(tbl3.balance3, 0) + IFNULL(tbl4.correct4, 0) + IFNULL(tbl6.summa_difference, 0)) AS TOTAL
FROM
(
SELECT driver_id, name, active, bank, dailypay_ind
FROM taxi_drivers
WHERE company_owners='0e897c0a3f48ae74a297b054eb333a26' AND profile_owner='e4cbb175b88f6ecc2437fdf312aff5ed') tbl1
LEFT JOIN
(
SELECT driver_id AS driver_id_tbl2, SUM(summa_for_payed) AS summa_for_payed2, SUM(summa_for_payed_company) AS summa_for_payed_company2
FROM taxi_profile_finance_f56c20d2026b4300ce00852caefa1d32
WHERE payed_status='0' AND DATE < '2020-07-07'
GROUP BY driver_id) tbl2 ON tbl1.driver_id = tbl2.driver_id_tbl2
LEFT JOIN
(
SELECT driver_id AS driver_id_tbl3, money AS balance3
FROM taxi_balance) tbl3 ON tbl1.driver_id = tbl3.driver_id_tbl3
LEFT JOIN
(
SELECT driver_id AS driver_id_tbl4, money AS correct4
FROM taxi_correct) tbl4 ON tbl1.driver_id LIKE tbl4.driver_id_tbl4
LEFT JOIN
(
SELECT to_driver_id, COMMENT
FROM taxi_log
GROUP BY to_driver_id) tbl5 ON tbl1.driver_id LIKE tbl5.to_driver_id
LEFT JOIN
(
SELECT driver_id AS driver_id_tbl6, SUM(difference) AS summa_difference, SUM(difference_company) AS summa_difference_company
FROM taxi_difference
WHERE profile_id='f56c20d2026b4300ce00852caefa1d32' AND DATE < '2020-07-07'
GROUP BY driver_id) tbl6 ON tbl1.driver_id LIKE tbl6.driver_id_tbl6
LEFT JOIN
(
SELECT DATE, driver_id AS driver_id_tbl7, zalogovaya_plata
FROM taxi_zalog) tbl7 ON tbl1.driver_id LIKE tbl7.driver_id_tbl7
LEFT JOIN
(
SELECT driver_id AS driver_id_tbl8, SUM(summa) AS summa_freezed, need_pay_1, MIN(need_pay_2) AS need_pay_2
FROM taxi_balance_freeze
GROUP BY driver_id_tbl8) tbl8 ON tbl1.driver_id = tbl8.driver_id_tbl8
ORDER BY tbl1.name
...
Рейтинг: 0 / 0
Оптимизация запроса
    #39977271
ADMINCHIKKK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сможете пример как-то показать? Как бы сделать правильнее?
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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