字元校驗集問題導致索引無法正常使用

hotdog04發表於2015-06-11
今天一個開發人員找說諮詢一個sql子查詢問題:
sql類似如下:
explain select  col1,count(1) from  xxx  r where custuid>0 and xx=0 and xx in (xxx,xx)
   and exists (SELECT 1 from yyy sp where sp.col2=r.col2
LIMIT 1) group by col1;
兩個表都不大,都不到十萬,正常情況應該很快就能執行出結果,結果一直執行不動。

分析原因首先檢視執行計劃:

字元校驗集問題導致索引無法正常使用
可以看到記憶體表居然走了全索引掃描!

檢視關聯列col2上的索引情況,yyy上是單列唯一索引,理論上不可能走全索引掃描,
進一步檢視錶結構發現問題所在了:
原來兩個表的col2欄位雖然都是varchar,但是使用了不同的校驗集:
一個是utf8_bin,另一個是預設的utf8_general_ci
校驗集主要影響的就是字串的排序比較場景。
正是這個原因導致關聯列無法正常使用索引。
解決辦法:兩個表的字符集改成一致即可
alter table xxx modify col2 varchar(30)  COLLATE utf8_bin ;


檢視執行計劃:
字元校驗集問題導致索引無法正常使用
可以看到eq_ref,索引正常使用了。
嘗試執行:0.02s


問題解決了,雖然很簡單,但是比較隱蔽,前後花了快1小時才找到原因。
後續處理:
再次強調開發人員提交ddl的時候不要自定義字元校驗規則(通常是沒有這個需要的),dba在稽核的時候也注意過濾這些資訊。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/20625855/viewspace-1696253/,如需轉載,請註明出處,否則將追究法律責任。

相關文章