首页 > 数据库 >故障分析 | 同一条 SQL 为何在 MariaDB 正常,MySQL 5.7 却很慢?

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

时间:2022-12-20 15:02:08浏览次数:41  
标签:排序 5.7 MySQL sbtest1 SQL MariaDB id


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


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

一、问题描述

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

二、环境检查

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

  1. MariaDB 的执行计划

故障分析 | 同一条 SQL 为何在 MariaDB 正常,MySQL 5.7 却很慢?_优化

  1. MySQL 5.7 的执行计划

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

  1. 表结构和列信息

故障分析 | 同一条 SQL 为何在 MariaDB 正常,MySQL 5.7 却很慢?_字段_03

三、分析过程

  1. 通过执行计划分析

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

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

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

四、解决方法:

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

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

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

  1. 使用 convert 转换

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

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

五、结论:

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


标签:排序,5.7,MySQL,sbtest1,SQL,MariaDB,id
From: https://blog.51cto.com/u_15077536/5955424

相关文章

  • 故障分析 | MySQL 无监听端口故障排查
    作者:王向爱可生DBA团队成员,负责公司DMP产品的运维和客户MySQL问题的处理。擅长数据库故障处理。对数据库技术和python有着浓厚的兴趣。前言最近解决了一个比较基础......
  • 第02期:MySQL 数据类型的艺术-大对象字段
    我以前分享过一篇​​《MySQL大对象一例》​​,今天就来详细说下大对象的优缺点以及使用场景。我们把MySQL的大对象类型分TEXT/BLOB和JSON两部分来说明。 一、TEX......
  • 技术分享 | MySQL中一个聚类增量统计 SQL 的需求
    作者:刘晨网名bisal,具有十年以上的应用运维工作经验,目前主要从事数据库应用研发能力提升和技术管理相关的工作,OracleACE,腾讯云TVP,拥有OracleOCM&OCP、EXINDevOpsM......
  • SQL Server 2019的触发器-trigger
    SQLServer2019的触发器-trigger一、trigger的介绍触发器是特殊的存储过程,它在特定的数据库活动发生时自动执行。触发器可以与特定表上的INSERT、DELETE、UPDATE......
  • 【Mysql系列】- SQL语句优化
    前言Sql语句优化是Mysql性能优化的一部分,我们看下常见Sql语句优化及注意的有哪些。 一、查询SQL尽量不要使用select*,而是具体字段1.反例SELECT*FROMuser......
  • java.sql.Connection 线程安全吗?
    首先看一段代码:try(Connectionconnection=DriverManager.getConnection("jdbc:mysql://remote01:3306/test");){ ExecutorServiceexecutor=ThreadUtil.newExecut......
  • mysql 分组后的数据显示和实际数据有差别
    SELECT*,count(1),SUM(if(ARRIVE.ARRIVE_TIME!='无',1,0))assFROMlt_cleanroute_point_arriveASARRIVEWHEREDATE_FORMAT(data_dt,'%Y-%m'......
  • Microsoft SQL Server 2008 R2 安装程序出错实例
    出现以下错误:''isnotavalidloginoryoudonothavepermission. 2-报错原因装这么多数据库,第一次遇到这种问题,于是开始上网查,报错原因是这样的:设置的电脑名......
  • H5 WebSQL每日成语
    有一天看到同事发的类似这种成语填空一样的内容。================惟利()视为德()终质非文()()追耗子================烂漫天()()则改之,无则嘉勉得()之作......
  • 面试官:MySQL一千万数据,怎么快速查询?
    前言面试官:来说说,一千万的数据,你是怎么查询的?me:直接分页查询,使用limit分页。面试官:有实操过吗?me:肯定有呀此刻献上一首《凉凉》也许有些人没遇过上千万数据量的表,也不清楚查......