优化where语句MYSQL

时间:2012-11-30 17:14:41

标签: mysql sql optimization where

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

2 个答案:

答案 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