【问题标题】:Rows_sent: 851 Rows_examined: 1649439, very slow queryRows_sent: 851 Rows_examined: 1649439,查询很慢
【发布时间】:2015-04-17 06:16:14
【问题描述】:

来自 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 的同一个人中选择所有行。结果将是示例图片中的黄色和橙色行。这就是我使用内连接的原因。

【问题讨论】:

  • 你为什么要自己加入唱片?在这种情况下,这似乎没有任何用处吗?
  • 运行以下命令并将结果分享到问题中。explain select ...
  • 确保record.school_idrecord.dept_id 上有索引,并去掉记录表上的自连接。看起来毫无意义。
  • 我添加一些词来解释为什么需要内连接。
  • WHERE dept_id=12345 有什么问题,然后进一步处理结果以获得这些人所属的其他部门?

标签: mysql mysql-slow-query-log


【解决方案1】:

为什么是 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

Building an INDEX from a SELECT

【讨论】:

  • 谢谢。问题确实是关于index。您建议的索引已经建立,经过我的调查,问题在表dept 中。我在表dept 中建立了两个索引,但是,mysql 自动选择了错误的索引,因此它为每个左连接遍历整个dept 表。在 LEFT JOIN 语句中使用 FORCE INDEX 有效!
猜你喜欢
  • 2012-08-02
  • 2011-05-06
  • 1970-01-01
  • 2017-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多