fast-je
@fast-je
Пишу на php.

Почему очень медленно выполняется запрос mysql?

Всем привет!
Есть вот такой запрос.
EXPLAIN SELECT SQL_CALC_FOUND_ROWS
  `t1`.*,
  `ti`.`id_task` `task_id_favorite`,
  `tm`.`id_task` `task_id_hidden`,
  `bw`.`idu` `id_user_white_list`,
  COUNT(DISTINCT `reserved_amount`.`id`) `reserved_amount_task`
FROM
  `tb_task_w` AS `t1`
JOIN
  `tb_task_r` `completed` ON `completed`.`id_user` = 345437 AND `completed`.`id_task` = `t1`.`id` AND `completed`.`status` = 2
LEFT JOIN
  `tb_task_i` `ti` ON `ti`.`id_user` = 345437 AND `ti`.`id_task` = `t1`.`id`
LEFT JOIN
  `tb_task_m` `tm` ON `tm`.`id_user` = 345437 AND `tm`.`id_task` = `t1`.`id`
LEFT JOIN
  `still_block_white` `bw` ON `bw`.`idb` = 345437 AND `bw`.`idu` = `t1`.`id_author`
LEFT JOIN
  `tb_task_r` `reserved_amount` ON `reserved_amount`.`id_task` = `t1`.`id` AND(
    `reserved_amount`.`status` = 0 OR `reserved_amount`.`status` = 1
  )
WHERE
  `t1`.`id` != '' AND `tm`.`id_task` IS NULL
GROUP BY
  `t1`.`id`
ORDER BY
  `t1`.`amount` DESC
LIMIT 0, 30


Он выполняется 7 секунд, я не пойму почему.
Далее я убираю.
LEFT JOIN
  `tb_task_r` `reserved_amount` ON `reserved_amount`.`id_task` = `t1`.`id` AND(
    `reserved_amount`.`status` = 0 OR `reserved_amount`.`status` = 1
  )


И он выполняется очень быстро, за 0.0013 сек.

Или также если убрать это
JOIN
  `tb_task_r` `completed` ON `completed`.`id_task` = `t1`.`id` AND `completed`.`id_user` = 212170 AND `completed`.`status` = 2

Запрос тоже выполняется куда быстрее менее 1 секунды.

Скрин explain'a запроса тяжелого

5e7c672c8caa4880520295.png

Скрин explain'a запроса легкого без `tb_task_r` `reserved_amount`

5e7c6c329f8e7420512089.png


Через какое-то время стало выполнятся около 2 секунд, сделал через профайлер
Выдало такое

5e7c7fbf5059c821318807.jpeg


Потом еще посмотрел в mysql-slow.log
скрин

5e7c800ebdb13729549034.jpeg

там есть запросы и по 17 секунд и считывает по 18 лямов строк, что-то я делаю не так в запросе, но что ?

Кол-во записей в tb_task_r = 153 350
Кол-во записей в tb_task_w = 7 160
Кол-во записей в tb_task_i = 24 918
Кол-во записей в tb_task_m = 101 626
Кол-во записей в still_block_white = 972
Почему так происходит ?
  • Вопрос задан
  • 132 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы