【MySQL进阶之路】千万级数据删除导致的慢查询SQL调优实战

news2024/11/30 2:46:51

欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送!

在我后台回复 「资料」 可领取编程高频电子书
在我后台回复「面试」可领取硬核面试笔记

文章导读地址:点击查看文章导读!

感谢你的关注!

在这里插入图片描述

千万级数据删除导致的慢查询SQL调优实战

先说一下案例背景:

刚开始,线上系统收到了大量的慢查询告警,检查之后,发现慢查询的都是一些比较简单的 SQL 语句,基本上都是单行查询,因此理论上性能应该是极高的,但是却变成了慢查询,因此考虑可能不是 SQL 语句性能的问题,而是 MySQL 服务器负载过高从而导致 SQL 语句执行过慢!

MySQL 服务器负载过高所导致的问题:

  • 如果 MySQL 的 磁盘 IO 负载过高 ,那么此时你的 SQL 语句来执行的时候,那么 MySQL 可能就顾不上你的磁盘请求了,导致你的 SQL 执行速度过慢
  • 如果 MySQL 的 网络 IO 负载过高 ,会导致你的应用与 MySQL 建立连接以及数据发送的速度过慢,从而导致 SQL 执行速度过慢的现象出现
  • 如果 MySQL 的 CPU 负载过高 也会导致这种情况出现,CPU 负责的任务太多了,导致轮不到你的 SQL 执行任务,从而导致 SQL 执行过慢

1、因此,第一步就是先排查 MySQL 服务器的问题

那么在查看服务器负载之后,发现磁盘 IO、网络 IO、内存、CPU 负载都处于正常水平,并没有出现高负载的情况,因此慢查询的原因应该不是服务器负载过高所导致的

2、第二步是对 SQL 语句的执行耗时进行分析

使用 MySQL 中的 profilling 工具来对 SQL 语句进行性能分析,profilling 工具记录了 SQL 语句的各种资源使用情况,包括 CPU、IO、上下文切换、内存使用等情况

  • 先通过命令开启会话级别的 profilling 功能,之后 MySQL 就会记录 SQL 语句的 profilling 信息了:
SET profiling = 1;
  • 分析 SQL 语句

使用 SHOW PROFILES 命令可以查看当前会话中所有已执行的SQL语句的Profiling信息

要查看特定SQL语句的详细信息,可以使用 SHOW PROFILE 命令,指定相应的查询ID(Query_ID)

# 查看所有 SQL 语句的 profilling 信息以及 query id
show profiles;
# 查看指定 SQL 语句信息
show profile cpu, block io for query [query_id]

当分析了 SQL 语句的 profilling 信息之后,发现它的 Sending Data 耗时最高,SQL 执行耗时 1s 左右,Sending Data 就占用了几乎 1s,因此 SQL 执行速度慢的原因找到了,是因为 Sending Data

3、进一步分析

但是仅仅凭借 Sending Data 还找不出为什么 SQL 执行这么慢,因此使用了 show engine innodb status 命令来查看 InnoDB 存储引擎当前的状态,此时发现 history list length 值特别大,达到了上万的级别

那么通过查询相关资料发现 history list length 值特别大表明数据库中有着大量事务正在执行,大量事务在执行的时候,会去构建 MVCC 的 undo log 版本链,如果大量事务一直不结束,就会导致这个 undo log 版本链过长,最后导致 history list length 值特别大

image-20240213124111081

因此猜测原因可能与 MySQL 中正在执行的大量事务有关

4、找到原因

那么经过排查,发现后台在跑一个定时任务,这个定时任务开启了一个事务去删除上千万条数据,并且这个事务运行的时间也很长,因此导致这个事务在运行期间,产生了大量的 undo log 版本链

那么此时其他事务来查询数据的时候,会把这些上千万条删除的数据都扫描一遍,因为这些数据是在记录版本链中的,而查询的话通过 MVCC 机制是需要去扫描记录版本链,因此 SQL 慢查询的原因就找到了:长事务中大量的删除操作,导致记录版本链过长,其他事务来查询数据时,需要扫描很多的记录版本链,导致普通的查询都会变得非常慢!

5、解决问题

针对这种问题,直接将删除很多数据的长事务给 kill 掉就可以了

之后要避免在业务高峰期的时候运行大量删除数据的语句,放在业务低峰期去执行,比如凌晨,这样会好一些

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pandas数据库大揭秘:read_sql、to_sql 参数详解与实战篇【第81篇—Pandas数据库】

Pandas数据库大揭秘:read_sql、to_sql 参数详解与实战篇 Pandas是Python中一流的数据处理库,而数据库则是数据存储和管理的核心。将两者结合使用,可以方便地实现数据的导入、导出和分析。本文将深入探讨Pandas中用于与数据库交互的两个关键方…

2024,欢迎来到性价比时代

「不是XX买不起,而是YY更有性价比。」——翻开过去一年的商业消费史,这句话几乎可以贯穿始终。年轻消费者们追求性价比的眼光一旦定型,一些品牌过去被品质生活、消费升级包装出来的华丽外壳,很容易一击就碎。 胜出的「性价比之王…

关于nuclei-ai-extension

nuclei-ai-extension 🍁 Nuclei 官方开发的 利用 AI 生成 nuclei 模板的工具。Nuclei AI - 用于快速生成 Nuclei 模板的浏览器扩展,Nuclei AI Browser Extension建立在 cloud.projectdiscovery.io 之上,使用户能够从任何网页中提取漏洞信息&…

【JAVA-Day77】Java线程继承Thread类实现Runnable接口

Java线程继承Thread类实现Runnable接口 《Java线程编程指南:轻松掌握线程的创建和启动》摘要 😊引言 🚀一、什么是进程和线程 ❓二、线程如何创建 😎2.1 继承Thread类并重写run()方法 📝2.2 实现Runnable接口并实现run…

ZISUOJ 2022年算法基础公选课练习四(Map)

说明: 博主为了提早预习数据结构和C的一些知识,自己琢磨外加查阅资料所写的代码,题目来源于22年初的学院老师组织的算法基础公选课的练习。我的代码甚至思路肯定存在许多不足和错误,欢迎大家批评指正。 题目列表: 问题…

操作系统-408

一、操作系统概述 1、定义 负责协调软件和硬件的计算机资源的工作为上层应用提供简易的服务操作系统是系统软件 2、功能: 操作系统是系统资源的管理者 处理机管理存储器管理文件管理设备管理向上层提供方便易用的服务 命令接口程序接口对硬件机器的扩展 3、特征…

(四十)大数据实战——Zabbix监控平台的部署搭建

前言 Zabbix是一款能够监控各种网络参数以及服务器健康性和完整性的软件。Zabbix使用灵活的通知机制,允许用户为几乎任何事件配置基于邮件的告警,这样可以快速反馈服务器的问题。基于已存储的数据,Zabbix提供了出色的报告和数据可视化功能。…

OpenGL-ES 学习(1)---- AlphaBlend

AlphaBlend OpenGL-ES 混合本质上是将 2 个片元的颜色进行调和(一般是求和操作),产生一个新的颜色 OpenGL ES 混合发生在片元通过各项测试之后,准备进入帧缓冲区的片元和原有的片元按照特定比例加权计算出最终片元的颜色值,不再是新&#xf…

PR:剪辑工具的使用

这些是剪辑工具: 选择工具 用来选择、拉伸或者拖拽用,如果放置到片段开头和结尾处会变成红色带箭头的方框,可以拉升或者缩短片段的时长 如果缩短的话,两段视频之间会出现空挡 可以点击空挡处,右键点击删除波纹&#xf…

Java毕业设计-基于ssh的网上电子商城管理系统-第74期

获取源码资料,请移步从戎源码网:从戎源码网_专业的计算机毕业设计网站 项目介绍 基于ssh的网上电子商城管理系统:前端jsp、js,后端 struts、spring、hibernate,集成商品浏览,商品详情,购物车&…

【Apache Superset】从概述、安装到运用,一篇掌握!

文章目录 什么是 Superset?Superset 的优势安装安装 Anaconda 包管理工具创建 Superset 的 Python 环境 下载 Superset 依赖更新工具安装 Superset配置 MySQL 元数据库初始化 Superset 数据库报错一报错二报错三数据库初始化完成 初始化 Superset报错一警告信息 启动…

【顶刊|修正】多区域综合能源系统热网建模及系统运行优化【复现+延伸】

目录 主要内容 部分代码 结果一览 下载链接 主要内容 该程序复现《多区域综合能源系统热网建模及系统运行优化》模型并进一步延伸,基于传热学的基本原理建立了区域热网能量传输通用模型,对热网热损方程线性化实现热网能量流建模&#xff…

VueCLI核心知识1:ref属性、props配置、mixin混入

1 ref 属性 ref属性类似于js原生获取DOM元素 <template><div><h1 v-text"msg" ref"title"></h1><button click"showDom">点我输出上方的Dom元素</button><School ref"sch"></School>…

消息队列RabbitMQ-使用过程中面临的问题与解决思路

消息队列在使用过程中会出现很多问题 首先就是消息的可靠性&#xff0c;也就是消息从发送到消费者接收&#xff0c;消息在这中间过程中可能会丢失 生产者到交换机的过程、交换机到队列的过程、消息队列中、消费者接收消息的过程中&#xff0c;这些过程中消息都可能会丢失。 …

UnityShader玉石效果

效果&#xff1a; 代码&#xff1a; Shader "MyShader/Jade" {Properties{_DiffuseColor("漫反射颜色",color)(1,1,1,1)_ThicknessMap("厚度图",2d)"white"{}_AddColor("叠加颜色",color)(1,1,1,1)_CubeMap("环境贴图…

【C++】const、static关键字和构造函数初始化

&#x1f497;个人主页&#x1f497; ⭐个人专栏——C学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 1. const修饰成员函数 1.1 语法格式 1.2 权限放大缩小 1.3 思考 1.4 解答 2. 再谈构造函数 2.1 构造函数体赋值 2.2 初始…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Navigation组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Navigation组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Navigation组件 鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#…

Mybatis开发辅助神器p6spy

Mybatis什么都好&#xff0c;就是不能打印完整的SQL语句&#xff0c;虽然可以根据数据来判断一二&#xff0c;但始终不能直观的看到实际语句。这对我们想用完整语句去数据库里执行&#xff0c;带来了不便。 怎么说呢不管用其他什么方式来实现完整语句&#xff0c;都始终不是Myb…

相机图像质量研究(18)常见问题总结:CMOS期间对成像的影响--CFA

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

B2科目二考试项目笔记

B2科目二考试项目笔记 1 桩考1.1 右起点倒库1.2 移库&#xff08;左→右&#xff09;1.3 驶向左起点1.4 左起点倒库1.5 驶向右起点 2 侧方停车考试阶段&#xff08;从路边开始&#xff09;&#xff1a; 3 直角转弯4 坡道定点停车和起步5 单边桥6 通过限速限宽门7 曲线行驶8 连续…