故障分析 | 同一条 SQL 为什么在 MariaDB 正常,MySQL 5.7 却很慢?

做者:王顺
爱可生 DBA 团队成员,在公司负责项目中处理数据库问题,喜欢学习技术,钻研技术问题。
本文来源:原创投稿
*爱可生开源社区出品,原创内容未经受权不得随意使用,转载请联系小编并注明来源。

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

1、问题描述

客户生产环境数据库迁移,数据库从 MariaDB 10.4 迁移到 MySQL 5.7,一条业务 SQL 运行很慢。从客户了解到业务以前在 MariaDB 运行正常,近期业务没有变动过,迁移到 MySQL 5.7 运行很慢,已经影响业务正常使用。数据库

2、环境检查

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

  1. MariaDB 的执行计划

图片1.png

  1. MySQL 5.7 的执行计划

图片2.png

  1. 表结构和列信息

图片3.png

3、分析过程

  1. 经过执行计划分析

图片4.png

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

  1. 查看图 3 表结构和列信息对比,两个表的 id 字段排序规则不一样存在隐式转换。以下:sbtest1 表 id 字段 char(32) 排序规则 utf8_binsbtest2 表 id 字段 char(32) 排序规则 utf8_general_ci

4、解决方法:

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

图片5.png

能够看到排序规则改变后,执行计划正常。spa

  1. 使用 convert 转换

图片6.png

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

5、结论:

MySQL 5.7 检测到表 sbtest1 的 id 字段和表 sbtest2 的 id 字段的 collation 不一样,没有正常走索引,形成查询很慢。经过改变排序规则或使用 convert 转换能够解决。因为 MariaDB 和 MySQL 的 collation 转换规则对执行计划的影响不一样,在 MariaDB 中,不一样的 Collation 并无影响到查询效率。blog

相关文章
相关标签/搜索