优化包含内部联接的选择查询

时间:2016-07-15 07:34:50

标签: mysql optimization

Mysql版本 - 5.5.39

我有两张表BugsBugStatus

我想获取给定用户的OpenClosed错误计数。

我目前正在使用此查询

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

2 个答案:

答案 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

Index Cookbook

答案 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