同一条SQL为何在MariaDB正常,MySQL5.7却很慢-爱可生

爱可生 DBA 团队成员,在公司负责项目中处理数据库问题,喜欢学习技术,钻研技术问题。


同一条 SQL 在 MariaDB 上运行正常,为什么在 MySQL 5.7 上运行很慢?


一、问题描述

客户生产环境数据库迁移,数据库从 MariaDB 10.4 迁移到 MySQL 5.7,一条业务 SQL 运行很慢。

从客户了解到业务之前在 MariaDB 运行正常,近期业务没有变更过,迁移到 MySQL 5.7 运行很慢,已经影响业务正常使用。


二、环境检查

(因生产环境涉及敏感信息,以下信息为测试环境信息)

1. MariaDB 的执行计划

同一条SQL为何在MariaDB正常,MySQL5.7却很慢-爱可生

2. MySQL 5.7 的执行计划

同一条SQL为何在MariaDB正常,MySQL5.7却很慢-爱可生

3. 表结构和列信息

同一条SQL为何在MariaDB正常,MySQL5.7却很慢-爱可生


三、分析过程

1. 通过执行计划分析

同一条SQL为何在MariaDB正常,MySQL5.7却很慢-爱可生

从 MySQL 5.7 执行计划的 warnings 中,可以清晰的看到 id 字段的字段类型或排序规则转换,无法使用索引。

2. 查看图 3 表结构和列信息对比,两个表的 id 字段排序规则不同存在隐式转换。

如下:

sbtest1 表 id 字段 char(32) 排序规则 utf8_bin

sbtest2 表 id 字段 char(32) 排序规则 utf8_general_ci


四、解决方法:

1. 将 sbtest1 表 id 字段排序规则 utf8_bin 改成 utf8_general_ci

同一条SQL为何在MariaDB正常,MySQL5.7却很慢-爱可生

可以看到排序规则改变后,执行计划正常。

2. 使用 convert 转换

同一条SQL为何在MariaDB正常,MySQL5.7却很慢-爱可生

使用 convert 对 sbtest1 表 id 字段进行转换,执行计划正常。


五、结论:

MySQL 5.7 检测到表 sbtest1 的 id 字段和表 sbtest2 的 id 字段的 collation 不同,没有正常走索引,造成查询很慢。通过改变排序规则或使用 convert 转换可以解决。由于 MariaDB 和 MySQL 的 collation 转换规则对执行计划的影响不同,在 MariaDB 中,不同的 Collation 并没有影响到查询效率。


关于爱可生

爱可生成立于2003年,依托于融合、开放、创新的数据处理技术和服务能力,为大型行业用户的特定场景提供深度挖掘数据价值的解决方案。

公司持续积累的核心关键技术,覆盖到分布式数据库集群、云数据平台、数据库大体量运管平台、海量数据集成于存储、清洗与治理、人工智能分析挖掘、可视化展现、安全与隐私保护等多个领域。

公司已与多个行业内的专业公司建立了长期伙伴关系,不断促进新技术与行业知识相结合,为用户寻求新的数据驱动的价值增长点。公司已在金融、能源电力、广电、政府等行业取得了众多大型用户典型成功案例,获得了市场的认可和业务的持续增长。

同一条SQL为何在MariaDB正常,MySQL5.7却很慢-爱可生


分享到:


相關文章: