优化MySQL自连接查询

时间:2014-01-04 22:09:18

标签: mysql sql optimization

我需要从表中选择符合特定条件的行对 这是一个演示我想要的SQL小提琴:

http://sqlfiddle.com/#!2/4fc2f/16/0

当表很小时,这很有效 - 但问题是我的生产表可能有特定日期的数百万行和数千行。查询现在需要14-15秒才能运行特定日期。我怎样才能改进它?

MySQL 5.5

2 个答案:

答案 0 :(得分:1)

你错过了一个索引。尝试使用EXPLAIN来分析您的查询,它会对您有所帮助。

解决方案很简单,这里是: http://sqlfiddle.com/#!2/56deb/1/0

您需要添加一个索引,该索引包含where语句中使用的列:

KEY `night_of_2` (`night_of`,`student_id`,`check_class`)

此外,您需要强制在连接上使用索引,因为您要将表连接到自身:

JOIN checks checks2

FORCE INDEX(night_of_2)ON(checks1.night_of = checks2.night_of)

(如果有更好的方式我想知道它):)

此致

答案 1 :(得分:1)

您的索引不是特别有效 - 您可以在索引中有多个列。但是为了获得正确的索引,您需要查看在数据库上运行的每个查询,每个查询的频率以及数据的分布。或者你只是要我们做你的功课?根据提供的信息,使用索引(night_of,check_class,student_id)时查询会更有效,并且除了PK之外会丢失现有索引。