記一次MySQL一次慢查詢的排查:MySQL字符集不一致導致索引失效

兩個表join查詢,explain查詢執行計劃的時候不走索引,這時候可以檢查兩張表字符集對應的字段的字符集,字符集對不上會造成索引失效的問題。

 

造成本次問題的原因是:有些舊錶需將原來utf8遷移爲utf8mb4,但只更改了表的字符集,而漏了更改字段的字符集。這一點以後需要注意。

另外在排查的過程當中,還發現字符集對不上的情況下,join查詢中對select count的影響最大,兩張幾千級的表join查詢可能需要耗時十幾秒,在對於left join而言,左表關聯列的字符集爲utf8,右表關聯列的字符集爲utf8mb4的時候,由於utfmb4是utf8的超集,select count的速度還是很快的,但反過來就會造成慢查詢的問題。對select * 的情況,utf8和utf8mb4左右表順序調換的影響比較小,估計數據量一大起來估計也還是會出現瓶頸的,只不過select count的來得更早一些罷了。所以還是儘量統一字符集。

 

下圖是關於MySQL8.0官方文檔關於使用索引的介紹,也提到了在非二進制的字符集的比較重應該儘量使用相同的字符集。

鏈接:https://dev.mysql.com/doc/refman/8.0/en/mysql-indexes.html

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