优化where语句MYSQL

我正在编写这个复杂的查询以返回一个大数据集,大约有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

上一篇:简化winforms代码跨线程调用


下一篇:使用Windows服务定时去执行一个方法的三种方式