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

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

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


一、问题描述

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

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


二、环境检查

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

1. MariaDB 的执行计划

2. MySQL 5.7 的执行计划

3. 表结构和列信息


三、分析过程

1. 通过执行计划分析

从 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

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

2. 使用 convert 转换

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


五、结论:

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


关于爱可生

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

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

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