MySQL下聯合索引與Where子句的優化的方法
在群友的分析指點下,嘗試把排序、條件等一個一個去除來做測試,結果發現問題就出在排序部分,去除排序的時候,執行時間由原來的48秒變成0.3x秒,這是個什么檔次的變化呀~~看著這個結果我激動ing.....
于是我把涉及排序的字段組成一個聯合索引alter table xx add index indexname(x1,x2,x3),經過2分鐘創建新索引之后再執行同一個SQL語句,哇塞0.28S。。。。爽
于是按照同樣的思路把其它幾個常用的SQL作了過些優化,效果馬上見效
過了30分鐘再查slow sql記錄文件,不好了,發現原來一個好好的SQL變得灰常慢了,神馬情況?
幾經分析和測試原來就是因為添加了聯合索引的原因,而且這個SQL語句當中有個or,當把這個or改用union之后問題排除。
這回又得出一個心得:寫SQL的時候千萬別一時就手,隨便寫個就OK,那會為以為帶來很嚴重的后果。
再附上一段關于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中的字段順序無所謂,可以隨便放在哪,應該盡可能地第一次就過濾掉大部分無用的數據,只返回最小范圍的數據。
關鍵字:MySQL、聯合索引、Where子句、優化
新文章:
- CentOS7下圖形配置網絡的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統后丟失windows啟動項
- CentOS單網卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網打印機IP講解
- CentOS7使用hostapd實現無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網絡重啟出錯
- 解決Centos7雙系統后丟失windows啟動項
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統有什么不同呢
- Centos 6.6默認iptable規則詳解