【问题标题】:Very slow sql query for count非常慢的 sql 查询计数
【发布时间】:2017-03-30 11:40:53
【问题描述】:

我需要获取每个用户角色的报告计数,但我的 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_assignment.item_name 是角色类型。

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

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

report.idcompany.id,有绑定

【问题讨论】:

  • 您检查过查询执行计划吗?

标签: mysql sql performance yii


【解决方案1】:

首先,您正在聚合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;

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

【讨论】:

  • 谢谢,内连接我的查询时间是 0.06 秒
  • 99.8% 改进。不错。
猜你喜欢
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
  • 1970-01-01
  • 2012-06-30
  • 1970-01-01
  • 2012-11-20
  • 2021-05-16
  • 1970-01-01
相关资源
最近更新 更多