MySQL数据库调优————SQL性能分析

news2024/11/30 10:40:47

TIPS
本文基于MySQL 8.0
本文探讨如何深入SQL内部,去分析其性能,包括了三种方式:

  • SHOW PROFILE
  • INFORMATION_SCHEMA.PROFILING
  • PERFORMANCE_SCHEMA

SHOW PROFILE

SHOW PROFILE是MySQL的一个性能分析命令,可以跟踪SQL各种资源消耗。使用格式如下:

SHOW PROFILE [type [,type] ... ]
	[FOR QUERY n]
	[LIMIT row_count [OFFSET offset]]
type:{
	  ALL					显示所有信息
	| BLOCK IO				显示阻塞的输入输出次数
	| CONTEXT SWITCHES		显示自愿及非自愿的上下文切换次数
	| CPU					显示用户与系统CPU使用时间
	| IPC					显示消息发送与接收的次数
	| MEMORY				显示内存相关的开销,目前未实现此功能
	| PAGE FAULTS			显示页错误相关开销信息
	| SOURCE				列出相应操作对应的函数名及其在源码中的位置(行)
	| SWPS					显示swap交换次数
}

默认情况下,SHOW PROFILE只展示Status和Duration两列,如果想展示更多信息,可指定type。
使用步骤如下:

  • 使用如下命令,查看是否支持SHOW PROFILE功能,yes表示支持。MySQL5.0.37开始,MySQL支持SHOW PROFILE。
select @@have_profiling;
  • 查看当前是否启用了SHOW PROFILE,0表示未启用,1表示已启用
select @@profiling;
  • 使用如下命令为当前会话开启或关闭性能分析,设成1表示开启,0表示关闭
set profiling = 1;
  • 使用SHOWPROFILS命令,可为最近发送的SQL语句做一个概要的性能分析。展示的条目数由profiling_history_size会话变量控制,该变量的默认值是15,最大值为100.将值设置为0具有禁用分析的实际效果。
-- 默认展示15条
show profiles;
-- 使用profiling_history_size调整展示的条目数
set profiling_history_size = 100;
  • 使用show profile分析指定查询:
SHOW PROFILES;

在这里插入图片描述

SHOW PROFILE;

在这里插入图片描述
默认情况下,只展示Status和Duration两列,如果想展示更多信息,可指定type。

SHOW PROFILE FOR QUERY 154;

在这里插入图片描述
展示CPU相关的开销

SHOW PROFILE CPU FOR QUERY 184;

在这里插入图片描述
分析完成后,记得关掉SHOW PROFILE功能;

TIPS

  • MySQL官方文档申明SHOW PROFILE已被废弃,并建议使用PerforMance Schema作为代替品。
  • 在某些系统上,性能分析只有部分功能可用。比如,部分功能在Windows系统下无效(show profile使用了getrusage()这个API,而在Windows系统上将会返回false,因为Windows不支持这个API);此外,性能分析是进程级的,而不是线程级的,这就意味着其他线程的活动可能会影响到一看到的计时信息。

INFORMATION_SCHEMA.PROFILING

INFORMATION_SCHEMA.PROFILING用来做性能分析,它的内容对应SHOW PROFILE和SHOW PROFILES语句产生的信息。除非设置了set profiling = 1否则该表不会有任何数据。该表包括以下字段:

  • QUERY_ID:语句的唯一标识
  • SEQ:一个序号,展示具有相同QUERY_ID值的行的显示顺序
  • STATE:分析状态
  • DURATION:在这个状态下持续了多久(秒)
  • CPU_USER,CPU_SYSTEM:用户和系统CPU使用情况(秒)
  • CONTEXT_VOLUNTARY,CONTEXT_INVOLUNTARY:发生了多少次自愿和非自愿的上下文切换
  • BLOCK_OPS_IN,BLOCK_OPS_OUT:块输入和输出操作的数量
  • MESSAGES_SENT,MESSAGES_RECEIVED:发送和接收的消息数
  • PAGE_FAULTS_MAJOR,PAGE_FAULTS_MINOR:主要和次要的页错误信息
  • SWAPS:发生了多少SWAP
  • SOURCE_FUNCTION,SOURCE_FILE,SOURCE_LINE:当前状态实在源码的哪里执行的

TIPS

  • SHOW PROFILE本质上使用的也是INFORMATION_SCHEMA.PROFILING表;
  • INFORMATION_SCHEMA.PROFILING表已被废弃,在未来可能会被删除。未来将可使用Performance Schema替代。
  • 下面两个SQL是等价的:
    SHOW PROFILE FOR QUERY 1;
    SELECT STATE,FORMAT(DURATION,6) AS DURATION FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID = 1 ORDER BY SEQ;

PERFORMANCE_SCHEMA

PERFORMANCE_SCHEMA是MySQL建议的性能分析方式,未来SHOW PROFILE,INFORMATION_SCHEMA.PROFILING都会废弃。PERFORMANCE_SCHEMA在MySQL5.6引入,因此,在此之上的更高的版本才能使用。可使用**SHOW VARIABLES LIKE ‘performance_schema’;**查看启用情况,MySQL5.7开始默认启用。

下面来用PERFORMANCE_SCHEMA去实现SHOW PROFILE类似的效果:

  • 查看是否开启性能监控
SELECT * FROM performance_schema.setuo_actors;

在这里插入图片描述
默认是开启的。

  • 也可以执行类似如下的SQL语句,只监控指定用户执行的SQL:
UPDATE performance_schema.setup_actors SET ENABLED = 'NO',HISTORY = 'NO' WHERE HOST = '%' AND USER = '%';

INSERT INTO performance_schema.setup_actors (HOST,USER,ROLE,ENABLED,HISTORY) VALUE
('localhost','test_user','%','YES','YES');

这样,就只会监控localhost服务器上test_user用户发送过来的SQL。其他服务器、其他用户发过来的SQL统统不监控。

  • 执行如下SQL语句,开启相关监控项:
UPDATE performance_schema.setup_instruments SET ENABLED = 'YES',TIMED = 'YES' WHERE NAME LIKE '%statement/%';

UPDATE performance_schema.setup_instruments SET ENABLED = 'YES',TIMED = 'YES' WHERE NAME LIKE '%stage/%';

UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%events_statements_%';

UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%events_stages_%';
  • 使用开启监控的用户,执行SQL语句,比如:
select * from employees where emp_no = '10001';

在这里插入图片描述

  • 执行如下SQL,获得语句的EVENT_ID:
SELECT EVENT_ID,TRUNCATE(TIMER_WAIT/1000000000000,6) AS Duration,SQL_TEXT
FROM performance_schema.events_statements_history_long
WHERE SQL_TEXT LIKE '%10001%';

在这里插入图片描述
这一步类似于SHOW PROFILES。

  • 执行如下SQL语句做性能分析,这样就可以知道这条语句各个阶段的信息了。
SELECT event_name AS State,TRUNCATE(TIMER_WAIT/1000000000000,6) AS Duration 
FROM performance_schema.events_stages_history_long
WHERE NESTING_EVENT_ID = 869;

在这里插入图片描述

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

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

相关文章

VLAN间通信,看完这个就完全懂了(单臂路由和三层交换)

第九章:实现VLAN间通信 划分VLAN后,由于广播报文只在同VLAN内转发,所以不同VLAN的用户间不能二层互访,这样能起到隔离广播的作用。但实际应用中,不同VLAN的用户又常有互访的需求,此时就需要实现不同VLAN的…

KDNM5000-10A-2剩余电流保护器测试仪

一、产品概述 KDNM5000-10A-2型剩余电流保护器测试仪(以下简称测试仪),是本公司改进产品,是符合国家标准《剩余电流动作保护器》(GB6829—95)中第8.3条和GB16917.1—1997中第9.9条验证AC型交流脱扣器动作特性要求的专用测试仪器。…

Nacos微服务笔记

Nacos安装Nacos 的 Github(Tags alibaba/nacos GitHub)下载我们所需的 Nacos 版本,可以选择 windows 或者 Linux。 进入官网,选择合适版本,tar.gz为linux版本,zip为windows版本。下载并解压 nacos-server…

【C++进阶】一、继承(总)

目录 一、继承的概念及定义 1.1 继承概念 1.2 继承定义 1.3 继承基类成员访问方式的变化 二、基类和派生类对象赋值转换 三、继承中的作用域 四、派生类的默认成员函数 五、继承与友元 六、继承与静态成员 七、菱形继承及菱形虚拟继承 7.1 继承的分类 7.2 菱形虚拟…

【SAP Abap】X-DOC:SE11 - 创建配置表并分配事务码

SE11 - 创建配置表并分配事务码1、创建自定义表2、创建表维护功能3、功能验证4、设置事务码5、带出字段默认值(1)方法一:表维护事件(2)方法二:屏幕事件1、创建自定义表 SE11,创建自定义表&…

结构体的三种定义方法、结构体类型名(可选标志符)什么时候可以省略

结构体的三种定义方法 一、单独定义: 先定义结构体类型,再定义变量   定义结构体的格式如下:    struct 结构体名 {    若干数据项;    } ;   其中,struct为关键字; 结构体名是用户定…

golang 入门教程:迷你 Twitter 后端

请记住,这个项目主要是为了稍微熟悉下Golang,您可以复制架构,但该项目缺少适当的 ORM,没有适当的身份验证或授权,我完全无视中间件,也没有测试。 我将在其自己的部分中讨论所有这些问题,但重要的…

利用NGROK将本地网站发布为一个公开网站

一般与第三方服务集成时,需要提供https的回调URL,本地开发阶段可以利用NGROK将本地网站发布为公开的https网站。https://ngrok.com/downloadWindow下载地址:https://bin.equinox.io/c/bNyj1mQVY4c/ngrok-v3-stable-windows-amd64.zip以Window…

echarts问题汇总

因为工作中经常使用echarts,做数据可视化相关需求,需要实现各种各样图表的需求。 有遇到过很多问题,一些网上不太好搜索到解决方案的,一直想总结一下解决过程。方便自己查阅,也方便别人参考。 一:echarts…

【C++】set/multiset、map/multimap的使用

目录 一、关联式容器 二、set的介绍 1、接口count与容器multiset 2、接口lower_bound和upper_bound 三、map的介绍 1、接口insert 2、接口insert和operator[]和at 3、容器multimap 四、map和set相关OJ 1、前K个高频单词 2、两个数组的交集 一、关联式容器 vector、…

【LeetCode】环形链表 II [M](链表)

142. 环形链表 II - 力扣(LeetCode) 一、题目 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链…

Python网络爬虫 学习笔记(1)requests库爬虫

文章目录Requests库网络爬虫requests.get()的基本使用框架requests.get()的带异常处理使用框架(重点)requests库的其他方法和HTTP协议(非重点)requests.get()的可选参数网络爬虫引发的问题(非重点)常见问题…

【C/C++】Windows下VS创建Linux项目

如果不想在Linux下用vim编写代码,可以在Windows下使用VS远程连接Linux(Linux下是不支持安装使用VS的),将VS上编写的代码通过 SSH协议 推送到Linux下,注意文件编写是在Windows上进行的,编译是在Linux下进行的…

【Hello Linux】Linux工具介绍 (make/makefile git)

作者:小萌新 专栏:Linux 作者简介:大二学生 希望能和大家一起进步! 本篇博客简介:介绍Linux的常用工具make/makefile git Linux项目自动化构建工具 – make/Makefile 背景 会不会写Makefile 从侧面说明了一个人是否具…

Spring Cloud微服务网关Gateway组件

目录 网关简介 什么是Spring Cloud Gateway Spring Cloud Gateway 功能特征 核心概念 工作原理 Spring Cloud Gateway快速开始 环境搭建 集成Nacos 路由断言工厂(Route Predicate Factories)配置 自定义路由断言工厂 过滤器工厂( …

window 配置深度学习环境GPU

CUDA 11.6 CUDNN Anaconda pytorch 参考网址:https://zhuanlan.zhihu.com/p/460806048 阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 (aliyun.com) 电脑信息 RTX 2060 GPU0 1. CUDA 11.6 1.1 确认信息 C:\Users\thzn>nvidia-smi (CUDA Versi…

秒杀项目之消息推送

目录一、创建消费者二、创建订单链路配置2.1 定义RabbitMQ配置类2.2 创建RabbitmqOrderConfig配置类三、如何实现RabbitMQ重复投递机制3.1 开启发送者消息确认模式3.2 消费发送确认3.2.1 创建ConfirmCallBack确认模式3.2.2 创建ReturnCallBack退回模式3.3 创建生产者3.4 创建消…

金三银四必看软件测试面试题,上百家公司面试都是这些套路

自我介绍说一下测试用例嗯,做测试,好多时间是在琢磨分析测试用例怎么去写,这个每个公司规范可能不太一样,但是大致思想是一致的。都是想要通过测试用例,把每一个分析到位,进行测试。就拿我上家公司来说吧&a…

数据库(2)--加深对统计查询的理解,熟练使用聚合函数

一、内容要求 利用sql建立学生信息数据库,并定义以下基本表: 学生(学号,年龄,性别,系号) 课程(课号,课名,学分,学时) 选课&#xff0…

融云入围「2022 云办公平台 TOP50」,进入「中国协同办公产业图谱」

2 月 10 日,中国科学院旗下《互联网周刊》颁布“2022 云办公平台 TOP50”,融云荣登榜单。 2 月 13 日,艾瑞咨询发布《2023 年中国协同办公行业研究报告》(下简称《报告》),对协同办公行业的供需动态和迭代方…