Mysql 数据库表字段字符集编码不一致导致隐式转换索引失效案例分析

发布时间 2023-06-15 16:17:46作者: 踏雪无痕2017

    有网友咨询,丢过来一段sql 语句,说是执行一次耗时10多分钟,让帮忙看看。表数据量在5万左右,数据量不大,首先确认表统计信息都是准确的,查询sql以及执行计划如下:

2f6ecc72341060cafcb4a0b821dae95

可以看到嵌套循环join 部分全表扫描,缺失索引,应该在join 条件列hoist_code、device_code 建立索引,但是网友反馈这2个条件列都已经存在索引,网友提供表结构建表sql 语句如下:

03abe5e97350e51c1da93397c741f6a

  不难看出,确实存在索引,但是仔细一看,2个字段字符集编码居然不一致,虽然2个表在表级定义的字符集编码都是UTF8MB4,但是hoist_code 却在列级定义了utf8 字符集编码,显然2个字符集编码不一致,发生了隐式转换,导致索引失效。解决方法也很简单:移除2表所有在列级定义的字符集编码,只在表级定义字符集编码为UTF8MB4。调整后sql 执行时间秒级,问题解决,sql 执行计划如下:

      2f9e02719738cffd51072da34c5c189