记一次因MySQL编码问题导致的慢查询排查

本文探讨了一个SQL联表查询在两个表数据量为20万时速度慢的问题。通过explain分析发现,尽管表b的name3和name4字段有高区分度的索引,但在联表查询中并未使用。原因是两个表的编码格式不同,一个是utf8,另一个是utf8md4。由于utf8md4是utf8的超集,它们的索引不兼容。解决方法是将表a的编码格式转换为utf8md4,通过`ALTER TABLE a CONVERT TO CHARACTER SET utf8md4`语句实现。转换后,查询性能显著提升。此外,文章提到MySQL从5.5.3开始支持utf8md4编码,用于存储四字节的Unicode字符,如emoji。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题背景

在工作时,有一个联表查询的操作,两个表,每个表大概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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值