1. 程式人生 > >記錄一次mysql有索引但是沒有用到的經歷

記錄一次mysql有索引但是沒有用到的經歷

前提:公司測試人員需要連線資料庫取資料,但是併發量高的時候會報等待獲取連線超時,所以經理讓我幫忙處理下,首先想到增大超時等待時間,改為60秒,300百左右併發是沒有問題的,但是提高到500以上時又報辣個錯誤,就在考慮應該優化下查詢sql,增加索引使查詢時間縮短來減少等待時間。

兩個sql很簡單,如下:

SELECT ID,ALARM_NUM,AlARM_text from iemp_alarm_inf where STATE = 0 AND ALARM_TYPE IN (1,2,4) AND DIVISION_CODE LIKE '6101%'


SELECT ID,ALARM_NUM,AlARM_text from iemp_alarm_inf where STATE = 2

所以在 state、division_code、alarm_type 三列上建立複合索引,另外根據索引左列限制,故將 state 放在最左列以保證兩個sql都能用到索引:

然後使用 explain 檢視,竟然都沒有用到索引,納尼???:

百思不得其解,最後懷疑是不是和列的型別有關,開啟表發現 state 型別為 char(也不知道誰當時設計成這個,列名字也起錯了,猜想應該是想起status),所以將 sql 中的 state = 2 改成 state = '2' 就解決了~

結論:1:索引列為字元型的時候需要加上引號,這樣才能用到索引(測試型別為 int  或者 integer 的時候,條件加引號也是可以使用到索引的)!

2:在這個基礎上我嘗試打亂 where 後條件的順序,結果都可以使用到index索引,證明where後的條件順序和索引順序無關,前提是在遵守索引左列限制的基礎上。

3:優化器認為走索引的話比全表掃更耗效能的時候也不會走索引,此時可以使用 force index 索引名 來強制使用索引(但是這大多數是多餘的)。