Mysql版本 - 5.5.39
我有两张表Bugs
和BugStatus
我想获取给定用户的Open
和Closed
错误计数。
我目前正在使用此查询
SELECT BugStatus.name,
count(BugStatus.name) AS count
FROM bugs
INNER JOIN BugStatus ON bugs.status = bugstatus.id
WHERE bugs.assignee='irakam'
GROUP BY bugstatus.name;
现在让我们假设我的Bugs
表中将有100,000行。此查询是否仍然存在或者我应该如何修改它。我确实使用了Explain
,但我仍然感到困惑。那么这个查询可以优化吗?
SQLFiddle链接 - Click here
答案 0 :(得分:1)
Select bs.name,
count(*) as count -- simply count(*) unless you are avoiding nulls
from bugs
inner join BugStatus AS bs ON bugs.status = bs.id
where bugs.assignee='irakam'
group by bs.name;
bugs: INDEX(assignee) -- since filtering occurs first
答案 1 :(得分:1)
您可以通过在bugs.status和bugs.assignee上创建索引来进一步优化您的表:
CREATE INDEX idx_bugs_assignee_status on bugs(assignee, status);
就执行计划而言:
选择类型:简单
这意味着您正在执行一个简单的查询,没有任何子查询或联合。
输入:ALL
这意味着您正在对错误状态表进行全表扫描(每行都要检查),对于大型表应该避免,但这对于BugStatus表是可以的,因为它只包含2行。
输入:ref
这意味着对于BugStatus中找到的每个行组合,都会从Bugs表中读取所有具有匹配索引值的行。
possible_keys
这列出了可能用于回答查询的索引(BugStatus的主键和bugs.status上的外键)
关键
这是优化器选择回答查询的实际索引(在BugStatus表的情况下没有,因为正在对其执行全表扫描,并且在bug的情况下,外键处于状态)表。)
REF
这显示了在连接表上用于比较结果的索引。
行
此列指示已检查的行数。
额外:使用临时;使用filesort
'使用临时'意味着mysql需要创建一个临时表来对结果进行排序,这是因为你的GROUP BY子句。 '使用filesort'这意味着数据库必须对结果执行另一次传递,以确定如何检索已排序的行。
额外:使用
表示您的查询中有WHERE子句。
请参阅:https://dev.mysql.com/doc/refman/5.5/en/explain-output.html