1. 程式人生 > >mysql聯合索引與Where子句優化淺析

mysql聯合索引與Where子句優化淺析

問題描述:
把排序、條件等一個一個去除來做測試,結果發現問題就出在排序部分,去除排序時,執行時間由原來的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查詢資料庫的時候,連線了很多個用,發現非常慢。

例如:
 

複製程式碼程式碼示例: SELECT ... WHERE p.languages_id = 1 AND m.languages_id = 1 AND c.languages_id = 1 AND t.languages_id = 1 AND p.products_id IN (472,474)  
 

 這樣查詢需要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中的欄位順序無所謂,應該儘可能地第一次就過濾掉大部分無用的資料,只返回最小範圍的資料。