慢SQL诊断

 最近经常遇到技术开发跑来问我慢SQL优化相关工作,所以干脆出几篇SQL相关优化技术月报,我这里就以公司mysql一致的5.7版本来说明下。

在企业中慢SQL问题进场会遇到,尤其像我们这种ERP行业。

成熟的公司企业都会有晚上的慢SQL监控和预警机制。不需要我们技术人员过多关注慢SQL的产生和收集,自然会有管理人员通知下来。一般来说慢SQL监控通常都是利用slowlog来实现的,这个比较简单:

mysql 默认是关闭slowlog的,不记录管理语句,也不记录不使用索引进行查找的查询,毕竟这也是一个额外的损耗。最小值和默认值long_query_time分别为 0 和 10。

可以查看是否开启了slowlog:

show variables like '%slow_query_log%';

 如果需要开启可以执行语句:或者去配置文件添加配置

set global slow_query_log=1;

这里就不再展示了,毕竟我们不是DBA。

那么发现了慢SQL之后怎么去定位问题?在mysql官网文档中性能问题诊断分析有提供分析方式。

1、慢SQL诊断SHOW PROFILES

mysql提供了show profiles和show profile语句提供的分析信息相当的数据,但是需要注意的是在未来的mysql中会弃用当前语句功能,使用性能模式performance_schema来替换,从8.0版本文档中确实没有看到这个语句了,但是听别说依旧可以使用,这个先不管了,反正目前看来mysql5.7在23年10月还在更新维护,那就没什么好说的。

确定当前版本是否支持show profiles

 select @@have_profiling;

如果支持那就开启下:(这种是临时开启,启动后会重置)

set profiling=1;

其他内容就不多说了,简单玩意,默认size是15,我这里调成了最大100。

2、已知执行SQL,诊断性能

如果现在你已经知道慢SQL是哪个了,就可以通过profiling来进行诊断。

比如当执行完SQL后,可以通过show profiles来显示发送到服务器的最新语句的列表(除了他自己)。

 接下来就可以通过show profile T for ID 来显示有关单个语句的详细信息。

show profile for query 19;

这里先对show profile语句做个简单的介绍:show profile T for ID

type可以指定 可选值来显示特定的附加类型的信息:ALL显示所有信息BLOCK IO显示块输入和输出操作的计数CONTEXT SWITCHES显示自愿和非自愿上下文切换的计数CPU显示用户和系统CPU使用时间IPC显示发送和接收的消息计数MEMORY目前尚未实施PAGE FAULTS显示主要和次要页面错误的计数SOURCE显示源代码中函数的名称,以及函数所在文件的名称和行号SWAPS显示交换计数

 比如你先查看当前SQL执行时CPU的情况,就可以show profile CPU for query 19,可以显示在各个阶段CPU的消耗。具体的使用可以根据需要来定。

对于show profile的结果,比较重要,这是我们诊断SQL问题的关键。返回内容比较多,都是SQL整个执行过程,我们也不需要关注所有的内容: 

System lock

确认是由于哪个锁引起的,通常是因为MySQL或InnoDB内核级的锁引起的。建议:如果耗时较大再关注即可,一般情况下都还

 Sending data

解释:【数据收集|检索+发送】该线程正在读取和处理语句的行 select,并将数据发送到客户端。由于在此状态期间发生的操作往往会执行大量磁盘访问(读取),因此它通常是给定查询生命周期中运行时间最长的状态。

建议:一般当前步骤耗时久,就是SQL本身的效能问题,可以通过做响应的优化手段,比如索引优化提高检索效率、分页控制数据量等等。

 Sorting result

正在对结果进行排序,类似Creating sort index,不过是正常表,而不是在内存表中进行排序

建议:一般在无索引order by、groupby都会有这样的步骤产生,如果当前阶段耗时久,可以考虑做一些索引优化来避免sort动作,或者进行数据量控制。

Sending to client

服务器正在向客户端写入数据包。Writing to netMySQL 5.7.8之前 称为此状态

 create sort index

当前的SELECT中需要用到临时表在进行ORDER BY排序

建议:一般在无索引order by、groupby都会有这样的步骤产生,如果当前阶段耗时久,可以考虑做一些索引优化来避免sort动作,或者进行数据量控制

 Creating tmp table

创建临时表。先拷贝数据到临时表,用完后再删除临时表。消耗内存,数据来回拷贝删除,消耗时间。

建议:比如groupby或者一些子查询会产生当前步骤,可以通过优化索引来避免

converting HEAP to MyISAM

查询结果太大,内存不够,数据往磁盘上搬了。

建议:优化索引或着数据量优化,可以调整max_heap_table_size

Copying to tmp table on disk

把内存中临时表复制到磁盘上,危险!!!

建议:优化索引,可以调整tmp_table_size参数,增大内存临时表大小

 上面列举一些常见内容项,详细的可以查看官网中资料(processlist):MySQL :: MySQL 5.7 Reference Manual :: 8.14.3 General Thread States d

处理一般线程state,官网还介绍了缓存、I/O线程状态等等。虽然内容是show processlist的,但是也适用于当前

到这里基本上就可以大致有个慢SQL诊断结果了,如果SQL本身需要优化,就可以做响应的执行进化分析过程。

3、线上问题分析定位

如果线上存在正在执行慢SQL,可以通过线程集来定位show processlist

比如当前线上正在慢SQL执行中:

 这样可以知道当前执行中的SQL当前自行过程中的状态,注意这个时实时的,所以可以通过多次观察来看耗时的步骤,比如当前SQL在sending to client持续时间很久,说明数据量很大,导致传输给客户端效率慢。

同时也可以通过explain connection for ID 来查看当前SQL执行计划:

explain for connection  99;

好了,诊断问题完成了,接下来就是具体的SQL分析和优化了。

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

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

相关文章

思福迪运维安全管理系统 test_qrcode_b RCE漏洞复现

0x01 产品简介 思福迪运维安全管理系统是思福迪开发的一款运维安全管理堡垒机。 0x02 漏洞概述 由于思福迪运维安全管理系统 test_qrcode_b路由存在命令执行漏洞,攻击者可通过该漏洞在服务器端任意执行代码,写入后门,获取服务器权限&#…

【Docker】vxlan的原理与实验

VXLAN(Virtual eXtensible Local Area Network,虚拟可扩展局域网),是一种虚拟化隧道通信技术。它是一种Overlay(覆盖网络)技术,通过三层的网络来搭建虚拟的二层网络。 VXLAN介绍 VXLAN是在底层…

【智能家居】八、监控摄像采集、人脸识别比对进行开门功能点

一、使用 fswebcam 测试 USB 摄像头 二、根据demo来实现功能点 三、功能点编写编译运行实现 四、mjpg实现监控识别 五、V4L2 视频设备 Linux 内核模块的一部分 一、使用 fswebcam 测试 USB 摄像头 a. 安装 fswebcam orangepiorangepi:~$ sudo apt update orangepiorangepi:~…

SSL证书可以有效避免劫持和钓鱼攻击

SSL证书对抗劫持和钓鱼攻击起到重要作用。通过使用SSL证书,网站可以防止黑客篡改网站内容或欺骗用户,确保用户所看到的是真实的网站信息,而不是被篡改的内容或诱导性的信息。这有助于保护用户的隐私和安全,并建立用户对网站的信任…

LeetCode008之字符串转换整数 (相关话题:状态机)

题目描述 请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C 中的 atoi 函数)。 函数 myAtoi(string s) 的算法如下: 读入字符串并丢弃无用的前导空格检查下一个字符(假设还…

一天搞定jmeter入门到入职全套教程之Jmeter分布式测试

随着并发量的增大,一台机器就不能满足需求了,所以我们采用分布式(Master-Slaver)的方案去执行高并发的测试 注意事项: Master机器一般我们不执测试,所以可以拿一台配置差些的机器,主要用来采集…

linux查看某个时间段的日志(sed -n)

有时候找出某个时间段的日志,如2023-12-09 20:11:00 到 2023-12-09 20:15:59 用grep不太方便直接过滤出来,能够使用sed根据时间去查 sed -n ‘/开始时间日期/,/结束时间日期/p’ 日志文件名称 如 sed -n /2023-12-09 20:11:00/,/2023-12-09 20:15:59/p…

git patch和使用

patch作用:修复了基线的一个bug,在未合并代码的时候,同步到各个版本的发布分支,用于解决问题 1、patch生成方式 # 方法一 # git 上传代码到页面后,git数字编号后去掉.patch刷新页面,复制更改部分&#xf…

c 语言 堆的解析(自我理解)!!!堆排序,建堆

目录 1.堆是什么? 2.堆的实现和接口。(小堆) 1.头文件 2.初始化 3.摧毁 4.向上调整(重点) 5.向下调整(重点) 6.插入(重点) 7.删除(重点) …

Linux---虚拟机软件

1. 虚拟机软件的介绍 它是能够虚拟出来计算机的一个软件。 常用虚拟机软件: VmwareVirtualBox 说明: 只有安装了虚拟机软件才可以创建虚拟机,当然通过虚拟机软件还可以创建多个虚拟机。 2. 虚拟机的介绍 就是模拟一个真实的计算机,好比一个虚拟的…

go学习之反射知识

反射 文章目录 反射1、反射的使用场景1)结构体标签的应用2)使用反射机制编写函数的适配器(桥连接) 2、反射的基本介绍-1.基本介绍-2.反射的图解-3.反射重要的函数和概念 3.反射快速入门-1.请编写一个函数,演示对&#…

【C进阶】C程序是怎么运作的呢?-- 程序环境和预处理(下)

前言: 这是程序环境和预处理的下半篇文章。至此,关于c语言知识点:从编译到运行的过程已讲解完毕。传送🚪,上半篇: http://t.csdnimg.cn/hvxmr 本章涉及的知识点: 宏和函数对比、命名约定、#undef、命令行定…

C语言习题集(029)

//写一个函数&#xff0c;用“起泡法”对输入的10个字符按由小 //到大顺序排列。 /* */ //解答&#xff1a; #include<stdio.h> void sort(char s[]) { int i, j; int lenstrlen(s)-1; char tmp; for(i0;i<len;i)for(j0;j<len-i;j)if(s[j]>s[j1]){ tmps[j]…

工作问题处理的三个境界

文章目录 境界一&#xff1a;快速解决问题境界二&#xff1a;对问题导致存量数据及后续风险进行评估境界三&#xff1a;对问题进行回顾、总结、反思 境界一&#xff1a;快速解决问题 境界二&#xff1a;对问题导致存量数据及后续风险进行评估 境界三&#xff1a;对问题进行回…

C语言—每日选择题—Day46

第一题 1. 下列程序段的输出结果是&#xff08;&#xff09; #include <stdio.h> int main() {int x 1,a 0,b 0;switch(x) {case 0: b;case 1: a;case 2: a;b;}printf("a%d,b%d\n", a, b);return 0; } A&#xff1a;a2,b1 B&#xff1a;a1,b1 C&#xf…

JVM面试

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.JVM 的整体结构2.类加载做了哪些事情?类加载器有哪些&#xff1f;双亲委派和沙箱安全 3.Java虚拟机栈是什么4.方法区的理解HotSpot 中方法区的演进方法区的内部结…

【Spring教程26】Spring框架实战:从零开始学习SpringMVC 之 bean加载控制

目录 1 问题分析2 思路分析3 环境准备4 设置bean加载控制5 知识点1&#xff1a;ComponentScan 欢迎大家回到《Java教程之Spring30天快速入门》&#xff0c;本教程所有示例均基于Maven实现&#xff0c;如果您对Maven还很陌生&#xff0c;请移步本人的博文《如何在windows11下安装…

文件搜索项目演示

演示功能搜索功能1&#xff1a;根据文件名搜索2&#xff1a;根据文件路径搜索3&#xff1a;根据文件名拼音(全拼、首拼)搜索 选择更新目录功能自动初始化和定时更新功能程序文件项目知识介绍 演示功能 搜索功能 1&#xff1a;根据文件名搜索 2&#xff1a;根据文件路径搜索 3…

Linux--操作系统

1. 常见的操作系统 Windowsmac OSLinuxiOSAndroid 2. 操作系统的定义 操作系统直接运行在计算机上的系统软件&#xff0c; 它是控制硬件和支持软件运行的计算机程序。 3. 操作系统的作用 向下控制硬件向上支持软件的运行&#xff0c;具有承上启下的作用。 4.总结 操作系统…

vue的组件传值

Vue中组件之间的数据传递可以使用props和$emit来实现。 1.使用props传递数据&#xff1a;父组件可以通过子组件的props属性向子组件传递数据。 父组件中&#xff1a; <template><div><child-component :message"parentMessage"></child-comp…