MySQL 数据库表字段字符集编码不一致导致隐式转换索引失效案例分析
有网友咨询,丢过来一段sql 语句,说是执行一次耗时10多分钟,让帮忙看看。表数据量在5万左右,数据量不大,首先确认表统计信息都是准确的,查询sql以及执行计划如下:
可以看到嵌套循环join 部分全表扫描,缺失索引,应该在join 条件列hoist_code、device_code 建立索引,但是网友反馈这2个条件列都已经存在索引,网友提供表结构建表sql 语句如下:
不难看出,确实存在索引,但是仔细一看,2个字段字符集编码居然不一致,虽然2个表在表级定义的字符集编码都是UTF8MB4,但是hoist_code 却在列级定义了utf8 字符集编码,显然2个字符集编码不一致,发生了隐式转换,导致索引失效。解决方法也很简单:移除2表所有在列级定义的字符集编码,只在表级定义字符集编码为UTF8MB4。调整后sql 执行时间秒级,问题解决,sql 执行计划如下:
本文来自博客园,作者:踏雪无痕2017,转载请注明原文链接:https://www.cnblogs.com/oradba/p/17483224.html