我正在编写这个复杂的查询以返回一个大数据集,大约有100,000条记录.查询运行良好,直到我将此OR语句添加到WHERE子句中:
AND (responses.StrategyFk = strategies.Id Or responses.StrategyFk IS
Null)
现在我了解到,通过在其中放置or语句会增加很多开销.
没有该声明,只是:
AND responses.StrategyFk = strategies.Id
该查询将在15秒内运行,但不会返回没有fk链接策略的任何记录.
虽然我也希望这些记录.有没有更简单的方法通过简单的where语句查找两条记录?我不能只为空记录添加另一个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
解决方法:
尝试:
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的作用.任何地方的响应.StrategyFkIS NULL将导致与策略表不匹配,并且将为此返回一行.
请参见此链接以获取有关连接的简单说明:http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html
之后,如果您仍然遇到性能问题,则可以开始查看EXPLAIN SELECT …;输出并寻找可能需要添加的索引. Optimizing Queries With Explain — MySQL Manual