2012-11-30 128 views
3

我正在編寫這個複雜的查詢來返回一個大型數據集,大約100,000條記錄。查詢運行良好,直到我在這個或語句添加到WHERE子句:優化where語句MYSQL

AND(responses.StrategyFk = strategies.Id或者responses.StrategyFk IS 空)

現在我明白,把這個語句放在那裏會增加很多開銷。

沒有這種說法,只是:

和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

嘗試:

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條件是真的需要的,因爲這是左連接在這種情況下所做的。任何地方的響應.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

+0

Ahh非常感謝!這效率更高。看起來我應該從現在開始使用這種顯式連接的方法。確切地說, – mmSQL

+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 
+0

感謝您的幫助。 – mmSQL