记录一次MySQL优化过程遇到的坑

相信很多开发都优化SQL语句,最近我在优化SQL是遇到了一个坑,在这里和大家分享一下;

通过页面抓取到耗时超过3秒的接口,找到对应的SQL,设置好相应参数,在测试环境通过Explain进行分析,查看执行计划,通过分析查看扫描是否走了索引,通过发现全都走了索引,在生产环境也都走了索引,想了很多办法找不到问题根源。

最后请教了大佬分析,他从数据库表结构类型去分析,发现我们生产的表采用的是utf8mb4,而测试是utf8,原因是同事前两天在修改了部分表的字符集,导致了生产环境部分表采用了utf8mb4,部分采用了utf8,关联表的字符集不一致导致的SQL明明走了索引却很慢的问题。

那么我们就要看看utf8mb4和utf8有什么区别了?

utf8mb4是在MySQL5.5.3之后增加编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。它是utf8的超集,一般默认都是utf8,而且utf8占用资源相对较少。

mysql支持的utf8编码最大字符长度为 3 字节,当遇到 4 字节的宽字符就会插入异常。3字节的utf8最大能编码的 Unicode 字符是 0xffff,也就是 Unicode 中的基本多文种平面。

在实际的开发过程中,建议使用utf8mb4类型,毕竟兼容性好,但是CHAR类型使用utf8mb4会浪费空间,可以将CHAR类型改为varchar类型。

 

 

猜你喜欢

转载自blog.csdn.net/weixin_42228950/article/details/109686629