故障分析 | 同一条 SQL 为何在 MariaDB 正常,MySQL 5.7 却很慢?
作者:王顺 爱可生 DBA 团队成员,在公司负责项目中处理数据库问题,喜欢学习技术,钻研技术问题。 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
同一条 SQL 在 MariaDB 上运行正常,为什么在 MySQL 5.7 上运行很慢?
一、问题描述
客户生产环境数据库迁移,数据库从 MariaDB 10.4 迁移到 MySQL 5.7,一条业务 SQL 运行很慢。从客户了解到业务之前在 MariaDB 运行正常,近期业务没有变更过,迁移到 MySQL 5.7 运行很慢,已经影响业务正常使用。
二、环境检查
(因生产环境涉及敏感信息,以下信息为测试环境信息)
- MariaDB 的执行计划
- MySQL 5.7 的执行计划
- 表结构和列信息
三、分析过程
- 通过执行计划分析
从 MySQL 5.7 执行计划的 warnings 中,可以清晰的看到 id 字段的字段类型或排序规则转换,无法使用索引。
- 查看图 3 表结构和列信息对比,两个表的 id 字段排序规则不同存在隐式转换。如下:sbtest1 表 id 字段 char(32) 排序规则 utf8_binsbtest2 表 id 字段 char(32) 排序规则 utf8_general_ci
四、解决方法:
- 将 sbtest1 表 id 字段排序规则 utf8_bin 改成 utf8_general_ci
可以看到排序规则改变后,执行计划正常。
- 使用 convert 转换
使用 convert 对 sbtest1 表 id 字段进行转换,执行计划正常。
五、结论:
MySQL 5.7 检测到表 sbtest1 的 id 字段和表 sbtest2 的 id 字段的 collation 不同,没有正常走索引,造成查询很慢。通过改变排序规则或使用 convert 转换可以解决。由于 MariaDB 和 MySQL 的 collation 转换规则对执行计划的影响不同,在 MariaDB 中,不同的 Collation 并没有影响到查询效率。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341