优化MYSQL的where语句

3
我正在编写一个复杂的查询以返回一个大数据集,大约有100,000条记录。查询在添加以下OR语句到WHERE子句之前运行良好:
AND (responses.StrategyFk = strategies.Id Or responses.StrategyFk IS Null)
现在我了解到,通过加入这个OR语句会增加很多开销。
如果没有这个语句,只有:
AND responses.StrategyFk = strategies.Id
查询在15秒内运行,但不会返回任何没有与策略链接的fk的记录。虽然我也想要这些记录。有没有更简单的方法来使用一个简单的where语句找到这两种记录?我不能只为null记录添加另一个AND语句,因为那样会破坏前面的语句。不太确定该怎么做。
以下是我的查询的下半部分。
FROM 
responses, subtestinstances, students, schools, items,
strategies, subtests

WHERE
subtestinstances.Id = responses.SubtestInstanceFk
AND subtestinstances.StudentFk = students.Id
AND students.SchoolFk = schools.Id
AND responses.ItemFk = items.Id
AND (responses.StrategyFk = strategies.Id Or responses.StrategyFk IS Null)
AND subtests.Id = subtestinstances.SubtestFk
2个回答

2

尝试使用明确的 JOIN

...
FROM   responses a
       INNER JOIN subtestinstances b
               ON b.id = a.subtestinstancefk
       INNER JOIN students c
               ON c.id = b.studentfk
       INNER JOIN schools d
               ON d.id = c.schoolfk
       INNER JOIN items e
               ON e.id = a.itemfk
       INNER JOIN subtests f
               ON f.id = b.subtestfk
       LEFT JOIN strategies g
              ON g.id = a.strategyfk 

2
尝试:
SELECT ... FROM 
responses
JOIN subtestinstances ON subtestinstances.Id = responses.SubtestInstanceFk
JOIN students ON subtestinstances.StudentFk = students.Id
JOIN schools ON students.SchoolFk = schools.Id
JOIN items ON responses.ItemFk = items.Id
JOIN subtests ON subtests.Id = subtestinstances.SubtestFk
LEFT JOIN strategies ON responses.StrategyFk = strategies.Id

这就是了。实际上不需要OR条件,因为在这种情况下,LEFT JOIN就是这样做的。任何地方responses.StrategyFk为空将导致与strategies表没有匹配,并且它将返回一个该行。
请参阅此链接以获得有关连接的简单说明:http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html 之后,如果您仍然遇到性能问题,那么可以开始查看EXPLAIN SELECT ...;输出并查找可能需要添加的索引。用Explain优化查询--MySQL手册

啊,非常感谢!这样更有效率。看起来我应该从现在开始使用这种显式连接的方法。 - mmSQL
准确地说,使用它更容易操作,也更容易让他人理解你的意图。 - Gavin Towey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接