多连接优化MySQL计数查询

多连接优化MySQL计数查询,mysql,sql,ruby-on-rails,Mysql,Sql,Ruby On Rails,我有一个SQL查询,返回计数需要3.5秒。查看查询的跟踪,看起来所有索引都在使用中。我可以做些什么来优化这一点以合理执行 我先表示感谢 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`

我有一个SQL查询,返回计数需要3.5秒。查看查询的跟踪,看起来所有索引都在使用中。我可以做些什么来优化这一点以合理执行

我先表示感谢


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 = ?))

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

跟踪 *工作指令*
使用以下索引检索该表:设施id、应用程序fac、工作订单状态id 您可以通过只查询索引中的字段来加速此查询。或者,您可以创建一个包含查询中每个字段(包括主键)的索引

扫描了该表中约33850行

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

资产
已使用以下索引检索表:PRIMARY

扫描了该表的大约1行

由用户完成的工作订单
已使用以下索引检索表:PRIMARY

扫描了该表的大约1行

消息
已使用以下索引检索表:workorder\u id

扫描了该表的大约2行

优先级
已使用以下索引检索表:PRIMARY

扫描了该表的大约1行

暂停原因
已使用以下索引检索表:PRIMARY

扫描了该表的大约1行

作业类型
已使用以下索引检索表:PRIMARY

扫描了该表的大约1行

工单状态
已使用以下索引检索表:PRIMARY

扫描了该表的大约1行

工作订单类型 已使用以下索引检索表:PRIMARY

扫描了该表的大约1行

工作顺序任务 使用以下索引检索表:索引\u工作订单\u任务\u工作订单\u id 您可以通过只查询索引中的字段来加速此查询。或者,您可以创建一个包含查询中每个字段(包括主键)的索引

扫描了该表的大约1行

频率 已使用以下索引检索表:PRIMARY

扫描了该表的大约1行

设施
已使用以下索引检索表:PRIMARY

扫描了该表的大约1行

位置
已使用以下索引检索表:PRIMARY


此表中大约有1行被扫描。

除非我遗漏了什么,否则您有一堆
左连接,它们不会影响最终结果(您选择的是
不同的workorder.id
-我猜这是一个PK列。然后只有where是重要的,
where(((workorders.workorder\u status\u id=?)和(workorders.application=?)和(workorders.facility_id=?)
。因此,我相信您可以摆脱所有
左连接,只需从1个表中进行选择即可编写,从而使优化器的使用更加轻松

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

上面的查询应该会提供与原始查询相同的结果,但所需的工作量要小得多。

这可能有助于显示创建此查询的模型。