天天看点

记一次因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