从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的同一个人中选择所有行。结果将是示例图片中的黄色和橙色行。这就是我使用内部联接的原因。
答案 0 :(得分:0)
为什么1.6M,而不是0.8M?似乎
对于这个计数器,两个表都是同一个表(“自联接”)是无关紧要的。
如何优化?如果您提供了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
存在问题 - 您尚未加入表格dept
或school
。