0

从 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

表中有大约 80 万行,record但查询为什么会检查超过 100 万行?

我已经为 tabledept和 table设置了索引school,但我不确定如何为内部连接部分创建索引。我读了一个先前的问题(Rows_sent: 12 Rows_examined: 549024 - how to optimize mySQL query?),但仍然无法解决我的极慢查询。

已编辑(为什么要进行内部连接):

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

表记录示例

4

1 回答 1

0

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

  1. 读取一张表的所有内容(0.8M),
  2. 对于这些行中的每一行,进入另一个表(另一个 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- 您尚未加入表deptschool.

从 SELECT 构建索引

于 2015-04-17T19:55:45.983 回答