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

問題描述:
把排序、條件等一個一個去除來作測試,結果發現問題就出在排序部分,去除排序時,執行時間由原來的48秒變成0.3x秒。
因而,把涉及排序的字段組成一個聯合索引alter table xx add index indexname(x1,x2,x3),通過2分鐘建立新索引以後,再執行同一個SQL語句,執行時間變成了0.28S。
 
例如,須要
where col1=??? and col2=???
則建議建立索引: (col1,col2)
mysql

若是須要 where col1=?? order by col3
則建議建立索引: (col1,col3)
sql

按照一樣的思路把其它幾個經常使用的SQL做了過些優化,效果很明顯的說。
過了30分鐘再查slow sql記錄文件,卻發現原來一個好好的SQL變得灰常慢了,爲什麼?數據庫

緣由分析:
由於添加了聯合索引的緣由,並且這個SQL語句當中有個or,當把這個or改用union以後問題排除。測試

附,一段關於Where子句的執行順序:優化

在用MySQL查詢數據庫的時候,鏈接了不少個用,發現很是慢。spa

例如:
 .net

複製代碼代碼示例:
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 ,而後再依次根據條件,縮小範圍。code

改變一下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中的字段順序無所謂,應該儘量地第一次就過濾掉大部分無用的數據,只返回最小範圍的數據。索引

相關文章
相關標籤/搜索