2016-07-15 70 views
2

MySQL版本 - 5.5.39含内优化选择查询加入

我有这两个表BugsBugStatus

我想给定用户获取OpenClosed的bug数量。

我目前使用此查询

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

回答

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 

Index Cookbook

1

您可以进一步通过创建bugs.status和bugs.assignee索引优化表:据

CREATE INDEX idx_bugs_assignee_status on bugs(assignee, status);

作为执行计划:

选择类型:简单

这意味着你正在执行一个简单的查询,没有任何的子查询或工会。

类型:所有

这意味着,你正在做一个全表扫描被在错误状态表完成(每行检查),应避免大的表,但是这对于BugStatus表是可以的,因为它只包含2行。

类型:REF

这意味着与匹配的索引值的所有行从错误表被读出,用于BugStatus找到的行的每个组合。

possible_keys

此列出了可能用来回答您的查询可能指数(BugStatus的主键,并在bugs.status外键)

关键

这是优化程序选择回答您的查询的实际索引(在BugStatus表的情况下,无sinc e正在对其执行全表扫描,并且在错误表的情况下处于外键状态。)

REF

这表明,使用上的连接表以比较结果的索引。

此列表示被检验的行的数目。

extra:Using temporary;使用filesort

'使用临时'意味着mysql需要创建一个临时表来排序结果,这是因为您的GROUP BY子句完成的。 '使用filesort'这意味着数据库必须对您的结果执行另一个传递以找出如何检索排序的行。

额外:使用哪里

意味着你在查询中有一个WHERE子句。

参见:https://dev.mysql.com/doc/refman/5.5/en/explain-output.html