天天看點

記一次因MySQL編碼問題導緻的慢查詢排查

問題背景

在工作時,有一個聯表查詢的操作,兩個表,每個表大概20萬條資料,查詢語句類似下面的SQL語句。

select a.name1, a.name2, b.name1, b.name2
from table1 a, table2 b on a.name3 = b.name3 and a.name4 = b.name4;
           

兩個表的name3和name4字段都建立了索引,但是查詢速度依舊很慢。

分析問題

使用explain分析該語句,發現表b并沒有使用索引,而是采用了全部周遊的方式。

表b上的name3,name4索引區分度很高,MySQL的優化器應該不會選擇不使用這兩個索引,那為什麼聯表查詢的時候沒走索引呢?

根本原因

最後一通排查,發現是兩個表的編碼格式不一樣,一個是utf8,一個是utf8md4。utf8md4是utf8的超集,但是兩者的索引并不相容,需要将utf8轉換成utf8md4。轉換語句如下

alter table a convert to character set utf8md4
           

這樣就可以使用索引了,查詢速度瞬間快了好多。

其他

MySQL在5.5.3之後增加了utf8md4這個編碼來相容四個位元組的unicode,可以用來存儲一些emoji表情等字元。

參考資料

https://www.huaweicloud.com/articles/5fece55be68259e89d87989ca69ee9ce.html