我需要从表中选择符合特定条件的行对 这是一个演示我想要的SQL小提琴:
http://sqlfiddle.com/#!2/4fc2f/16/0
当表很小时,这很有效 - 但问题是我的生产表可能有特定日期的数百万行和数千行。查询现在需要14-15秒才能运行特定日期。我怎样才能改进它?
MySQL 5.5
答案 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之外会丢失现有索引。