非常慢的SQL查询计数

时间:2017-03-30 11:40:54

标签: mysql sql performance yii

我需要为每个用户角色获取报告计数,但我的SQL查询非常慢(良好服务器上40秒)。我的SQL查询:

SELECT `auth_assignment`.`item_name`, COUNT(*) as count
FROM `report`
LEFT JOIN `company` ON company.id = report.company_id
LEFT JOIN `auth_assignment` 
ON auth_assignment.user_id = company.user_id
GROUP BY `auth_assignment`.`item_name`
ORDER BY `count`

auth_assignmentitem_name是角色类型。

auth_assignment有~23k行。 company ~11k行。

reports ~12k行(一家公司可以有很多报告)。

reportidcompanyid,具有约束力

1 个答案:

答案 0 :(得分:0)

首先,您要汇总left join第三个​​表中的列。我猜你不想要NULL这个值,所以请使用inner join或更改表格的顺序。

表别名使查询更容易编写和阅读:

SELECT aa.item_name, COUNT(*) as cnt
FROM report r JOIN
     company c
     ON c.id = r.company_id JOIN
     auth_assignment aa
     ON aa.user_id = c.user_id
GROUP BY aa.item_name
ORDER BY cnt;

假设表的连接是正确的,那么您只想确保有索引。这些应该放在用于join的列上:company(id, user_id)auth_assignment(user_id, item_name)