技术分享
🗒️记一次因MySQL编码问题导致的慢查询排查
00 分钟
2021-8-22
2023-9-27
type
status
date
summary
slug
tags
category
password
URL
icon

问题背景

在工作时,有一个联表查询的操作,两个表,每个表大概20万条数据,查询语句类似下面的SQL语句。
两个表的name3和name4字段都建立了索引,但是查询速度依旧很慢。

分析问题

使用explain分析该语句,发现表b并没有使用索引,而是采用了全部遍历的方式。 表b上的name3,name4索引区分度很高,MySQL的优化器应该不会选择不使用这两个索引,那为什么联表查询的时候没走索引呢?

根本原因

最后一通排查,发现是两个表的编码格式不一样,一个是utf8,一个是utf8md4。utf8md4是utf8的超集,但是两者的索引并不兼容,需要将utf8转换成utf8md4。转换语句如下
这样就可以使用索引了,查询速度瞬间快了好多。

其他

MySQL在5.5.3之后增加了utf8md4这个编码来兼容四个字节的unicode,可以用来存储一些emoji表情等字符。
上一篇
利用K-均值聚类算法对未标注数据分组
下一篇
记一次让自己排查好久的小bug