【发布时间】:2020-08-19 04:36:05
【问题描述】:
我遇到了查询速度非常慢的问题。当我从查询activity_tracker 或registration_statuses 中删除时,查询速度会更快(3-4 秒)。
activity_tracker - ~300 000rows
registration_statuses - ~300 000 行
用户 - ~32000 行
select users.name as 'Agent',
count(registration_statuses.id ) as 'Odoslané na DÚ',
count( registration_statuses.id ) as 'Uzatvorené',
count(activity_tracker.id) as 'Akcia vyhľadávania',
count(activity_tracker.id) as 'Otvorenie zložky',
count(activity_tracker.id) as 'Úprava/Uloženie zložky',
count(activity_tracker.id) as 'Zmena stavu zložky',
count(activity_tracker.id) as 'Pridanie aktualizácie zložky',
count(activity_tracker.id) as 'Pridanie poznámky zložky'
from `users`
left join `activity_tracker` on `users`.`id` = `activity_tracker`.`user_id`
left join `registration_statuses` on `users`.`id` = `registration_statuses`.`created_by`
inner join `role_user` on `users`.`id` = `role_user`.`user_id`
where `role_user`.`role_id` <> 4
and (`registration_statuses`.`created_at` between '1970-01-01' and '2022-08-08')
group by users.name
Explain 有输出
1 SIMPLE role_user range PRIMARY,role_user_role_id_foreign role_user_role_id_foreign 4 NULL 95 Using where; Using index; Using temporary; Using f...
1 SIMPLE users eq_ref PRIMARY PRIMARY 4 role_user.user_id 1
1 SIMPLE registration_statuses ref registration_statuses_created_by_foreign registration_statuses_created_by_foreign 5 role_user.user_id 1889 Using where
1 SIMPLE activity_tracker ref activity_tracker_user_id_foreign activity_tracker_user_id_foreign 4 role_user.user_id 3004 Using index
【问题讨论】:
-
(1) 根据您的过滤条件,
left joins 不是必需的。 (2) 哪个左连接导致了问题? -
created_date 条件是否适用于registration_statuses ???我相信 mysql 使用 yyyy-mm-dd 格式..
-
@GordonLinoff 我尝试使用
join/inner join相同的结果。问题是当我同时加入activity_tracker和registration_statuses时。当我只加入其中一个时,我会更快(3-4 秒)获得结果。 -
@Shoaeb 我不好,是的,格式不好,但 yyyy-mm-dd 和 yyyy-mm-dd hh:mi:ss 的结果也一样。
-
我们需要更多信息来帮助您。请阅读这个。 meta.stackoverflow.com/questions/271055/… 它有一个很好的关于查询性能的部分。那么请edit你的问题。
标签: mysql sql mariadb query-performance