专栏首页爱可生开源社区故障分析 | 同一条 SQL 为何在 MariaDB 正常,MySQL 5.7 却很慢?

故障分析 | 同一条 SQL 为何在 MariaDB 正常,MySQL 5.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 并没有影响到查询效率。

本文分享自微信公众号 - 爱可生开源社区(ActiontechOSS),作者:王顺

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 新特性解读 | 从 wireshark 看 MySQL 8.0 加密连接

    爱可生 DBA 团队成员,负责项目日常问题处理及公司平台问题排查。热爱 IT,喜欢在互联网里畅游,擅长摄影、厨艺,不会厨艺的 DBA 不是好司机,didi~

    爱可生开源社区
  • 故障分析 | MySQL TEXT 字段的限制

    项目中有一个数据交换的场景,由于使用了很多个 varchar(1000)、 varchar(2000),导致在创建表的时候,MySQL 提示:

    爱可生开源社区
  • 第09问:MySQL 莫名崩溃,如何保留现场?

    一旦遇到生产环境上的 MySQL 崩溃,就需要保留现场信息,供分析用。虽然 MySQL 的 error log 中会打印部分信息,但对于比较隐蔽的崩溃,往往显得...

    爱可生开源社区
  • 三四五线城市,移动互联网时代最后的红利

    最近,大家在大谈消费降级,其实这只是表象,真正的原因其实在于,商业巨子们都把目光投向了三四五线。从过去一年新崛起的商业新贵和创新产品来看,三四五线城市,这是移动...

    金融民工小曾
  • Android 中 MD5 的几种生成方式(小结)

    Java 提供了MessageDigest 类用来处理消息摘要算法,如MD5 ,SHA-1 和SHA-256 等。

    砸漏
  • 无线网络嗅探中的Radiotap

    引言 在WLAN无线网络抓包的时候不管是用wireshark、tcpdump还是scapy都会出现Radiotap、LLC、SNAP协议层。 如图所示: ? L...

    FB客服
  • java之hibernate之helloworld

    2.增加一个lib文件夹,并把 hibernate必须的jar包 和 数据库驱动包 一起复制进去

    Vincent-yuan
  • 业余草双因素认证(2FA)教程

    所谓认证(authentication)就是确认用户的身份,是网站登录必不可少的步骤。 密码是最常见的认证方法,但是不安全,容...

    业余草
  • 携程 Apollo 配置中心传统 .NET 项目集成实践

    可能由于 Apollo 配置中心的客户端源码一直处于更新中,导致其相关文档有些跟不上节奏,部分文档写的不规范,很容易给做对接的新手朋友造成误导。

    Esofar
  • salesforce lightning零基础学习(十六) 公用组件之 获取字段label信息

    我们做的项目好多都是多语言的项目,针对不同国家需要展示不同的语言的标题。我们在classic中的VF page可谓是得心应手,因为系统中已经封装好了我们可以直接...

    用户1169343

扫码关注云+社区

领取腾讯云代金券