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表情等字符。
- 作者:luxinfeng
- 链接:https://www.luxinfeng.top/article/20210822
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。