MySQL 优化 - index_merge 导致查询偶发变慢

文章目录

    • 前言
    • 问题描述
    • 原因分析
    • 总结

前言

今天遇到了一个有意思的问题,线上数据库 CPU 出现了偶发的抖动。定位到原因是一条查询语句偶发变慢造成的,随后通过调整表中的索引解决。

问题描述

下方是脱敏后的 SQL 语句:

select 
  oss_path 
from 
  table_name 
where 
  status = 2 
  and enabled = 1 
  and user_id = 12324215

表中除了主键外,还有两个索引,分别是 status 字段的二级索引和 user_id 字段的中二级索引。经过观察这类 SQL 的执行计划有两种:

  • SQL 偶发会使用 index_merge 通过使用两个字段的索引过滤,然后取交集,再返回数据,耗时 120 秒。
  • SQL 会使用 user_id 字段的索引进行过滤,耗时 50ms。

SQL 的执行耗时差别非常大,究竟是为何呢?见下文分析。

原因分析

SQL 变慢的原因就是使用了 index_merge,可以通过 explain format = json 查看执行计划,access_type = index_merge 表示使用了两个索引。index_merge 也叫索引合并是优化器想利用两个索引,取交集或并集操作后,再回表获取数据。从而优化一些 SQL 表中字段有多个 and 或者 or 的查询,刚好这些 and 和 or 字段上有索引。

index_merge 分三种类型:

  • intersect:多个索引的条件使用 AND
  • union:多个索引的条件使用 OR
  • sort_union:多个索引的条件使用 OR

如何确认是哪种类型的呢?explain format = json 中的 key 字段中 intersect(idx_user_id, idx_status) 会显示 merge 的索引和类型。

在上方案例中的 SQL 使用的是 intersect 类型的 merge,执行过程大致是:

  1. 从 idx_user_id 索引中读取满足条件的数据。
  2. 从 idx_status 索引中读取满足条件的数据。
  3. 将 步骤 1、步骤 2 获取到的记录求交集。
  4. 根据步骤3 的得到的 rowid 回表获取数据。
  5. 判断记录是否满足其它额外的条件。

相信看到这里,就知道为什么两种执行计划差别这么大的原因了。idx_status 字段的索引选择性非常差,通过该字段过滤后的结果集有 80w 行,而 idx_user_id 字段选择性非常好,过滤后只有 5 行。通过 idx_status 字段过滤一次数据就需要几十秒的时间,再加上取交集的时间,耗费直接 100 多秒了。属于优化器的缺陷,也反映了表中的索引建立的不规范,因为 status 字段的选择性非常差,因为它只有 0,1,2,3 四种取值,当然也会有特殊情况。

优化的方法也非常简单,既然优化器走了 intersect(idx_user_id, idx_status) 我们就创建一个 user_id、status 的复合索引,创建完成后 idx_user_id 索引就变成了冗余索引,需要在复合索引创建完成后,删除掉。

索引调整完成后,就再也没有出现这类查询偶发变慢的情况了。

另外,值得注意的是,使用了 index_merge 的 SQL,慢日志中记录的扫描行数是取交集时的扫描行数,这部分扫描行数可能会很小,容易造成干扰,为什么只扫描了 9w 行,反而花费了几百秒。我们只需要把 index_merge 中的索引字段分别拆出来执行一遍,就知道慢在哪里了。

总结

优化器通过某种机制检测到 index_merge 能带来性能提升,某些情况下不会带来提升,反而会耗费更长的时间,属于优化器的缺陷,可以通过调整表中的索引来解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/594673.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何更好的使用cpm

nvidia发布了RAFT库,支持向量数据库的底层计算优化,RAFT 也使用CMake Package Manager( CPM )和rapids-cmake管理项目,可以方便快捷的下载到需要的对应版本的thirdparty的依赖库,但是,一般情况下,项目是直接…

数据库复习1

1.试述数据、数据库、数据库管理系统、数据库系统的概念 1.数据(Data): 数据是关于事物的符号表示或描述。它可以是任何事实、观察或者测量的结果,如数字、字符、声音、图像等。数据在没有上下文的情况下可能没有明确的意义。 2.数据库(Database): 数据库是一个持…

面试题:集合篇

说说 List, Set, Queue, Map 四者的区别? List(对付顺序的好帮手): 存储的元素是有序的、可重复的。Set(注重独一无二的性质): 存储的元素是无序的、不可重复的。Queue(实现排队功能的叫号机): 按特定的排队规则来确定先后顺序,存储的元素是有序的、可重…

传输层协议 TCP UDP协议 解析(二)

文章目录 UDP:用户数据报协议UDP报文格式TCP与UDP的区别 UDP:用户数据报协议 UDP是一种面向无连接的传输层协议(数据一直发送,没有ack,所以不需要考虑ack),传输可靠性没有保证。 UDP不提供重传…

Rust 实战thiserror+自定义错误消息体

导航 一、背景二、实践1、导入thiserror2、自定义错误消息体(1)创建ErrMsg.rs和创建自定义结构体(2)lib.rs添加ErrMsg(3)main函数(4)完整代码 一、背景 开发中遇到需要通用、能够满…

Note-backbone预训练权重对模型收敛速度的影响和mmlab实验测试

简介 在训练一些复杂模型时候,通常会考虑读取backbone的预训练权重,这种方法有以下好处: 初始化网络参数:在深度学习模型训练过程中,通常需要随机初始化神经网络的参数。然而,如果采用Backbone预训练权重进…

拼多多不花钱推广能做起来吗

拼多多推广可以使用3an推客。3an推客(CPS模式)给商家提供的营销工具,由商家自主设置佣金比例,激励推广者去帮助商家推广商品链接,按最终有效交易金额支付佣金,不成交不扣费。是商家破零、积累基础销量的重要…

背景音乐广播系统解决方案

背景音乐广播系统解决方案18123651365 在公共广播背景音乐系统虽然是一个小小分支,但是却与人们的生活质量直接挂钩,如早晨时间,可以通过播放一些愉快的音乐,使得住宅居名、上班一族和晨运一族有一个愉快的心情,精神抖…

《QT实用小工具·五十六》自适应界面变化的控件

1、概述 源码放在文章末尾 该项目实现了网格显示多张带文字的图片在界面中自适应布局 特点 跟随窗口大小变换位置,并带移动动画 响应鼠标事件,图片缩放动画 点击水波纹动画 项目demo演示如下所示: 项目部分代码如下所示: #i…

剖析QMS质量管理系统:推动企业效益提升的关键因素

质量管理系统(QMS)是企业管理中至关重要的一环,它涵盖了组织的所有流程和活动,并旨在提高产品和服务的质量。通过实施和运营一个有效的QMS,企业能够不断改进其业务,满足客户需求,提高竞争力&…

书生浦语第三节茴香豆:搭建你的RAG智能助理笔记

RAG(Retrieval Augmented Generation)是一项通过检索与用户输入相关的信息片段,并结合外部知识库来生成更准确、更丰富的回答的技术。解决 LLMs 在处理知识密集型任务时可能遇到的挑战, 如幻觉、知识过时和缺乏透明、可追溯的推理过程等。提供…

4月威胁态势 | 0day占比82%!Polyransom勒索家族强势来袭

近日,亚信安全正式发布《2024年4月威胁态势报告》(以下简称“报告”),报告显示,4月份新增安全漏洞1260个,涉及0day漏洞占82%;监测发现当前较活跃的勒索病毒家族是Polyransom和Blocker&#xff0…

SPI思想机制

目录 如何解释简单概括SPI 和 APISPI 实现原理(重要-线程上下文类加载器) 如何使用一个Demo功能介绍使用效果(直接在本地模拟服务商提供服务)使用效果(通过 jar 的方式引入) 应用分析参考文章 如何解释 简…

Docker容器:Docker-Consul的容器服务更新与发现

目录 前言 一、什么是服务注册与发现 二、 Docker-Consul 概述 1、Consul 概念 2、Consul 提供的一些关键特性 3、Consul 的优缺点 4、传统模式与自动发现注册模式的区别 4.1 传统模式 4.2 自动发现注册模式 5、Consul 核心组件 5.1 Consul-Template组件 5.2 Consu…

Blazor流程编排的艺术:深入Z.Blazor.Diagrams库的使用与实践

合集 - .Net(3)1.基于AntSK与LLamaSharp打造私人定制的离线AI知识库03-032.深入解析:AntSK 0.1.7版本的技术革新与多模型管理策略03-123.Blazor流程编排的艺术:深入Z.Blazor.Diagrams库的使用与实践05-05收起 为现代网页应用开发提供动力的其中一…

招展工作的接近尾声“2024上海国际科技创新展会”即将盛大开幕

2024上海国际科技创新展会,即将于6月中旬在上海新国际博览中心盛大召开。随着招展工作的接近尾声,目前仍有少量余位可供各企业和机构预定。这一盛大的科技展会,将汇聚全球智能科技领域的精英,共同展示最新的科技成果,探…

【Spring】JdbcTemplate

JdbcTemplate 是 Spring 提供的一个 JDBC 模板类,是对 JDBC 的封装,简化 JDBC 代码 也可以让 Spring 集成其它的 ORM 框架,例如:MyBatis、Hibernate 等 使用 JdbcTemplate 完成增删改查 一、环境准备 数据库: 准备…

【JavaEE 初阶(二)】线程安全问题

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ 🚚我的代码仓库: 33的代码仓库🚚 🫵🫵🫵关注我带你了解更多线程知识 目录 1.前言2.synchronized2.1例子2.2synchronized修饰代码块2.3 synchronized修饰方法2.4sy…

one command each day on Linux- big synopsis

url address 1.12) grep Linux下面查找文本命令grep, 类似于Window编辑器的ctrlF查找我们想要的内容, PS:对比learning skill 看一下它的基础用法,准备一个目录文件和文本文件, 打印出这个单词,或者包含有这个字母的所有字符串 [rootiZ2vc5lqzt23aweti4j777Z ~]# grep hel…
最新文章