我正在编写这个复杂的查询来返回一个大型数据集,大约有100,000个记录。查询运行正常,直到我将此OR语句添加到WHERE子句:
AND(respond.StrategyFk = strategies.Id或answers.StrategyFk IS 空)
现在我明白通过将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
答案 0 :(得分:2)
尝试使用明确的JOIN
s:
...
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
答案 1 :(得分: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在这种情况下的作用。任何响应.StrategyFk IS NULL将导致与strategies
表不匹配,并且它将为此返回一行。
有关联接的简单说明,请参阅此链接:http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html
之后,如果您仍然遇到性能问题,那么您可以开始查看EXPLAIN SELECT ... ;
输出并查找可能需要添加的索引。 Optimizing Queries With Explain -- MySQL Manual