mysql 使用force index優化查詢

最近查詢數據庫的時候發現,一個簡單查詢語句,添加一個條件以後,查詢速度慢得不能接受,先直接看當時的情況。

數據庫的數據量有1億多條,數據量是比較大:



正常的查詢語句,是比較快地查詢出來,執行3個並列條件的語句,結果如下:

mysql> SELECT * FROM ActionLog_8001 where 1=1 and UserID = 20026 and UserLevel >= 1 and UserLevel <= 100 and LogDateTime >= '2016-04-23 14:47:03' and LogDateTime < '2016-04-27 14:47:03' order by LogDateTime desc;



可是,當我再並列查詢多一個條件以後,並列查詢ActionType,查詢結果就完成另一個樣了:

SELECT * FROM ActionLog_8001 where 1=1 and UserID = 20026 and ActionType = 2 and UserLevel >= 1 and UserLevel <= 100 and LogDateTime >= '2016-04-23 14:47:03' and LogDateTime < '2016-04-27 14:47:03' order by LogDateTime desc limit 0,1;


查詢過程用了26秒多,完全出乎意料,同時因爲這個問題導致網頁超時。


先分析這種情況,首先,全部條件查詢的字段都有索引,不然真不知道查到猴年馬月了。

接着,能explain去分析對比查詢語句。


兩個查詢語句的對比是這樣的,連接類型,使用的key和優化查詢的策略不一樣。


這兩個是導致查詢慢的原因:使用了索引合併優化策略。

解決的辦法是把UserID和ActionType兩個條件用and的括號先並起來查詢,強制使用UserID索引。


優化的結果還能接受的。

PS:感謝蔡淼同事的指點,在這問題上能得以容易解決。

在此記錄一下整個問題的處理過程,以便以後有類似的問題發生容易查詢。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章