浪子归家|MySQL 优化案例中字符集转换-爱可生( 二 )

通过查看表定义后 , 可以看到 b 表字符集为 utf8 , 而 t 表与 r 表字符集都为 utf8mb4!!!那么基本可以验证我的猜想 , 当 MySQL 创建视图时 , 如果发现表连接字段字符集不相同时 , 会自动添加字符集转换 。
另外之前我们有个为什么 b 表没有走索引 , 是因为缺失了索引吗?的疑问 。 从上面 b 表的表结构定义就可以看出 ,b 表的连接字段为 TableGuid , 是 b 表的主键 , 那么肯定存在主键索引 , 就更不可能不走索引而选择全表扫描了 。
浪子归家|MySQL 优化案例中字符集转换-爱可生
六、修改字符集
为了验证因为字符集问题而导致表连接没有走索引 , 我们选择将 b 表 metadata_tablebasicinfo 的字符集修改为 utf8mb4 。
过程如下:
--修改表的默认字符集和所有列的字符集为utf8mb4 ALTER TABLE metadata_tablebasicinfo CONVERT TO CHARACTER SET utf8mb4;
通过上述操作后 , 目前 b 表为 utf8mb4 字符集 。
七、视图重建
将 b 表字符集修改为 utf8mb4 后 , 去查看 view_dataquality_analysis 视图定义 , 发现还是存在字符集转换 , 所以猜测这类自动添加转换的机制不会因为表结构更改而自动去掉 。
我们再次将视图中字符集转换的内容去掉后 , 保存视图 , 发现这次不会自动添加字符集转换 。 那么这次应该就应该会走索引啦~
我们再次执行问题 SQL , 执行时间为 0.2s , 速度明显就正常了 。
浪子归家|MySQL 优化案例中字符集转换-爱可生再来看一波执行计划 , 可以看到 b 表上走的是主键索引 , 这下舒服了~
浪子归家|MySQL 优化案例中字符集转换-爱可生八、问题总结
通过这次问题排查 , 发现了字符集不同原来也会导致索引失效 。 其实这个问题有点类似于 int=varchar隐式转换问题 , 等号左边为 int 类型 , 右边为 varchar 类型 , 那么 MySQL 会自动转换类型为一致 , 因而无法走索引 。
下次如果再出现类似的问题 , 可以先查看下视图定义 , 如果存在字符集转换的内容 , 那么就可以检查是否是类似的问题!
另外还有一个注意的点就是 , 列的字符集也有可能与表的字符集不同!
关于爱可生
爱可生成立于2003年 , 依托于融合、开放、创新的数据处理技术和服务能力 , 为大型行业用户的特定场景提供深度挖掘数据价值的解决方案 。
公司持续积累的核心关键技术 , 覆盖到分布式数据库集群、云数据平台、数据库大体量运管平台、海量数据集成于存储、清洗与治理、人工智能分析挖掘、可视化展现、安全与隐私保护等多个领域 。
【浪子归家|MySQL 优化案例中字符集转换-爱可生】公司已与多个行业内的专业公司建立了长期伙伴关系 , 不断促进新技术与行业知识相结合 , 为用户寻求新的数据驱动的价值增长点 。 公司已在金融、能源电力、广电、政府等行业取得了众多大型用户典型成功案例 , 获得了市场的认可和业务的持续增长 。
浪子归家|MySQL 优化案例中字符集转换-爱可生


推荐阅读