最近查詢數據庫的時候發現,一個簡單查詢語句,添加一個條件以後,查詢速度慢得不能接受,先直接看當時的情況。
數據庫的數據量有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:感謝蔡淼同事的指點,在這問題上能得以容易解決。
在此記錄一下整個問題的處理過程,以便以後有類似的問題發生容易查詢。