gpt4 book ai didi

mysql - 使用多个连接优化 MySQL Count 查询

转载 作者:行者123 更新时间:2023-11-29 08:35:45 25 4
gpt4 key购买 nike

我有一个 SQL 查询需要 3.5 秒以上才能返回计数。查看查询的跟踪,看起来所有索引都已被使用。我可以做些什么来优化它以合理执行?

提前致谢。

<小时/>

Link to trace

SQL 详细信息

查询

SELECT count(DISTINCT `workorders`.id) AS count_all FROM `workorders` 
LEFT OUTER JOIN `users` ON `users`.id = `workorders`.user_id
LEFT OUTER JOIN `assets` ON `assets`.id = `workorders`.asset_id
LEFT OUTER JOIN `users` completed_by_users_workorders ON `completed_by_users_workorders`.id = `workorders`.completed_by_user_id
LEFT OUTER JOIN `messages` ON messages.workorder_id = workorders.id LEFT OUTER JOIN `priorities` ON `priorities`.id = `workorders`.priority_id
LEFT OUTER JOIN `suspension_reasons` ON `suspension_reasons`.id = `workorders`.suspension_reason_id
LEFT OUTER JOIN `job_types` ON `job_types`.id = `workorders`.job_type_id
LEFT OUTER JOIN `workorder_statuses` ON `workorder_statuses`.id = `workorders`.workorder_status_id
LEFT OUTER JOIN `workorder_types` ON `workorder_types`.id = `workorders`.workorder_type_id
LEFT OUTER JOIN `workorder_tasks` ON workorder_tasks.workorder_id = workorders.id
LEFT OUTER JOIN `frequencies` ON `frequencies`.id = `workorder_tasks`.frequency_id
LEFT OUTER JOIN `facilities` ON `facilities`.id = `workorders`.facility_id
LEFT OUTER JOIN `locations` ON `locations`.id = `workorders`.location_id
WHERE ((((workorders.workorder_status_id = ?)) AND (workorders.application = ?)) AND (workorders.facility_id = ?))
<小时/>

持续时间 3,791 毫秒查询分析(显示详细信息)

追踪*工单*
使用以下索引检索表:facility_id、app_fac、workorder_status_id您可以通过仅查询索引内的字段来加速此查询。或者,您可以创建一个包含查询中每个字段(包括主键)的索引。

扫描了该表的大约 33850 行。

用户
该表是使用以下索引检索的:PRIMARY大约扫描了该表的 1 行。

Assets
该表是使用以下索引检索的:PRIMARY

大约扫描了该表的 1 行。

completed_by_users_workorders
该表是使用以下索引检索的:PRIMARY

大约扫描了该表的 1 行。

消息
使用以下索引检索表:workorder_id

扫描了该表的大约 2 行。

优先事项
该表是使用以下索引检索的:PRIMARY

大约扫描了该表的 1 行。

暂停原因
该表是使用以下索引检索的:PRIMARY

大约扫描了该表的 1 行。

工作类型
该表是使用以下索引检索的:PRIMARY

大约扫描了该表的 1 行。

workorder_statuses
该表是使用以下索引检索的:PRIMARY

大约扫描了该表的 1 行。

workorder_types该表是使用以下索引检索的:PRIMARY

大约扫描了该表的 1 行。

workorder_tasks使用以下索引检索表:index_workorder_tasks_on_workorder_id您可以通过仅查询索引内的字段来加速此查询。或者,您可以创建一个包含查询中每个字段(包括主键)的索引。

大约扫描了该表的 1 行。

频率该表是使用以下索引检索的:PRIMARY

大约扫描了该表的 1 行。

设施
该表是使用以下索引检索的:PRIMARY

大约扫描了该表的 1 行。

地点
该表是使用以下索引检索的:PRIMARY

大约扫描了该表的 1 行。

最佳答案

除非我遗漏了一些东西,否则你有一堆LEFT JOIN,它们不会影响最终结果(你正在选择distinct workorders.id - 我猜它是PK 列。然后只有重要的地方, WHERE (((workorders.workorder_status_id = ?)) AND (workorders.application = ?)) AND (workorders.facility_id = ?) 。所以我相信您可以摆脱所有 LEFT JOIN 并只从 1 个表中进行选择,从而使优化器的工作变得更加轻松......

SELECT count(*) AS count_all
FROM `workorders`
WHERE ((((workorders.workorder_status_id = ?)) AND (workorders.application = ?)) AND
(workorders.facility_id = ?)

上面的查询应该会为您提供与原始查询相同的结果,但花费的精力要少得多。

关于mysql - 使用多个连接优化 MySQL Count 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15277497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com