問題描述:
把排序、條件等一個一個去除來做測試,結果發現問題就出在排序部分,去除排序時,執行時間由原來的48秒變成0.3x秒。
于是,把涉及排序的字段組成一個聯合索引alter table xx add index indexname(x1,x2,x3),經過2分鐘創建新索引之后,再執行同一個SQL語句,執行時間變成了0.28S。
?
例如,需要
where col1=??? and col2=???
則建議創建索引: (col1,col2)
如果需要 where col1=?? order by col3
則建議創建索引: (col1,col3)
按照同樣的思路把其它幾個常用的SQL作了過些優化,效果很明顯的說。
過了30分鐘再查slow sql記錄文件,卻發現原來一個好好的SQL變得灰常慢了,為何?
原因分析:
因為添加了聯合索引的原因,而且這個SQL語句當中有個or,當把這個or改用union之后問題排除。
附,一段關于Where子句的執行順序:
在用MySQL查詢數據庫的時候,連接了很多個用,發現非常慢。
例如:
?
?
?這樣查詢需要20多秒,雖然在各個字段上都建立了索引。用分析Explain SQL一分析,發現在第一次分析過程中就返回了幾萬條數據:
WHERE p.languages_id = 1 ,然后再依次根據條件,縮小范圍。
改變一下WHERE 字段的位置之后,速度就有了明顯地提高:
WHERE p.products_id IN (472,474) AND p.languages_id = 1 AND m.languages_id = 1 AND c.languages_id = 1 AND t.languages_id = 1??
這樣,第一次的條件是p.products_id IN (472,474),它返回的結果只有不到10條,接下來還要根據其它的條件來過濾,自然在速度上有了較大的提升。
實踐小結:
不要以為WHERE中的字段順序無所謂,應該盡可能地第一次就過濾掉大部分無用的數據,只返回最小范圍的數據。