Rows_sent:851 Rows_examined:1649439,查询速度非常慢

时间:2015-04-17 06:16:15

标签: mysql mysql-slow-query-log

从mysql-slow-log:

登录

Query_time:11.632750 Lock_time:1.317329 Rows_sent:851 Rows_examined:1649439

select record.name, dept.name, school.name FROM record

inner join record as r2 ON
record.number=r2.number AND record.year=r2.year
AND r2.dept_id=12345 AND r2.type=1 AND r2.year=2015

LEFT JOIN school ON record.school_id=school.id
LEFT JOIN dept ON record.dept_id=dept.id

record中有大约80万行,但查询如何检查超过100万行?

我已经为表格dept和表格school设置了索引,但我不确定如何为内部联接部分创建索引。我阅读了上一个问题(Rows_sent: 12 Rows_examined: 549024 - how to optimize mySQL query?),但仍然无法获得极慢查询的解决方案。

已编辑(为什么是内部联接):

我想从dept_id = 12345的同一个人中选择所有行。结果将是示例图片中的黄色和橙色行。这就是我使用内部联接的原因。

example of table record

1 个答案:

答案 0 :(得分:0)

为什么1.6M,而不是0.8M?似乎

  1. 读取所有一个表(0.8M),
  2. 对于每一行,到达另一个表(另一个0.8M)。
  3. 对于这个计数器,两个表都是同一个表(“自联接”)是无关紧要的。

    如何优化?如果您提供了SHOW CREATE TABLE record,会更容易回答,但这是一个猜测。

    添加两个索引:

    INDEX(dept_id, year, type) -- the fields can be in any order
    INDEX(number, year) -- the fields can be in either order
    

    第一个非常有效地让你进入r2。第二个使JOIN非常有效。

    select record.name, dept.name, school.name FROM record存在问题 - 您尚未加入表格deptschool

    Building an INDEX from a SELECT