当前位置: 首页 > news >正文

Mysql高级篇(中)—— SQL优化之查询截取分析

SQL优化之查询截取分析

  • 一、慢查询日志
    • (1)简述
    • (2)如何开启
    • (3)慢查询日志分析工具介绍(了解)
    • (4)官方工具 mysqldumpslow
      • 简述
      • 如何使用
  • 二、SHOW PROCESSLIST
  • 三、(了解)Show Profile
  • 四、Performance Schema
    • (1)简述
    • (2)特点
    • (3)组成
    • (4)相关表介绍
    • (5)使用实例
  • 五、(了解)全局查询日志(General Query Log)

一、慢查询日志

(1)简述

慢查询日志 记录了所有超过指定时间阈值的 SQL 查询。MySQL 允许你设置一个“慢查询阈值”(long_query_time),如果某个查询执行时间超过这个阈值,就会被记录到慢查询日志中。这个阈值的单位是秒默认值通常为 10 秒

(2)如何开启

默认情况 下,MySQL 的慢查询日志功能是 关闭 的,需要手动启用
查看 慢查询日志是否开启

  • SHOW VARIABLES LIKE '%slow_query_log%'; 查看慢查询日志是否开启 默认情况下slow_query_log 的值为OFF,表示慢查询日志是禁用

方法一:通过 SQL 命令动态启用


SET GLOBAL slow_query_log = 'ON';  -- 开启慢查询日志
SET GLOBAL slow_query_log_file = '/path/to/mysql-slow.log';  -- 设置日志文件路径
SET GLOBAL long_query_time = 2;  -- 设置慢查询的时间阈值(秒)
SET GLOBAL log_queries_not_using_indexes = 1;  -- 记录没有使用索引的查询
SET GLOBAL log_output=FILE  -- 指定 MySQL 慢查询日志的输出目标为文件格式

方法二:修改 MySQL 配置文件

在配置文件 my.cnf[mysqld]下的配置为永久生效


[mysqld]
slow_query_log = 1  # 开启慢查询日志
slow_query_log_file = /var/log/mysql-slow.log  # 指定慢查询日志文件的路径
long_query_time = 2  # 定义慢查询的阈值为2秒(可根据需要调整)
log_queries_not_using_indexes = 1  # (可选)记录没有使用索引的查询
log_output=FILE  # (可选)指定 MySQL 慢查询日志的输出目标为文件格式

log_output=FILE(了解)
在这里插入图片描述

(3)慢查询日志分析工具介绍(了解)

  • 如果您需要详细的日志分析功能,pt-query-digest是一个不错的选择。
  • 如果您倾向于使用官方工具MySQL Enterprise Monitor适合企业级用户。
  • 如果您偏向于简单的命令行工具mysqldumpslow非常容易。
  • 如果您需要图形化界面实时监控风速计GoAccess是较好的选择。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(4)官方工具 mysqldumpslow

简述

mysqldumpslowMySQL官方自带的一个简单的命令行工具,用于分析MySQL慢查询日志。它可以帮助用户快速获取慢查询日志中的汇总信息,按多种维度(如查询执行次数平均时间返回行数)等)对慢速查询进行排序,然后数据库管理员发现需要优化的SQL查询。

在这里插入图片描述
在这里插入图片描述


如何使用

常见使用示例

> 1. 按【执行时间】排序,显示最慢的10个查询:
mysqldumpslow -s t -t 10 /path/to/mysql-slow.log> 2. 按【查询次数】排序,显示执行次数最多的5个查询:
mysqldumpslow -s c -t 5 /path/to/mysql-slow.log> 3. 查看【包含特定关键词】(如SELECT)的慢查询:
mysqldumpslow -g "SELECT" /path/to/mysql-slow.log> 4. 按【返回行数】排序,顺序显示前20个查询:
mysqldumpslow -s r -t 20 -r /path/to/mysql-slow.log> 5. 显示所有查询的详细信息,不隐藏参数:
mysqldumpslow -a /path/to/mysql-slow.log

结果输出
在这里插入图片描述

二、SHOW PROCESSLIST

查询 mysql 进程列表,可以杀掉故障进程

还可以通过SHOW FULL PROCESSLIST获取完整的SQL语句,特别是当Info字段的SQL语句非常长时,SHOW PROCESSLIST可能只显示部分内容,而 SHOW FULL PROCESSLIST 会显示完整内容。

在这里插入图片描述

三、(了解)Show Profile

SHOW PROFILEMySQL 中一个 用于诊断和调试查询性能的工具,能够 展示查询在执行时消耗的时间和资源分配情况。通过 SHOW PROFILE,你可以查看一个查询执行的各个阶段所花费的时间,这对于优化慢查询非常有帮助。

虽然 MySQL 5.6 开始,它的功能逐渐被 Performance Schema 替代,但它依然是一个易于使用的性能诊断工具。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、Performance Schema

(1)简述

Performance SchemaMySQL用于监控和分析数据库性能的强大工具,它从 MySQL 5.5 开始引入,并逐渐取代了一些旧的性能分析工具,如 SHOW PROFILEPerformance Schema 主要通过收集 MySQL 服务器在运行时的内部数据来帮助用户了解系统的性能表现,尤其是识别系统瓶颈。它可以监控大量的数据库活动,比如 等待事件、锁定、存储引擎的运行情况 等。

(2)特点

  • 低开销: 它被设计为高效、轻量级的监控工具,尽量减少对数据库性能的影响。
  • 灵活性: 可以根据需要启用或禁用监控特定的事件。
  • 可定制性: 用户可以选择监控的粒度,例如全局、会话级别,或者特定的线程、表或用户。

(3)组成

Performance Schema核心是系统表,这些表位于 performance_schema 数据库中,它们存储了各种性能相关的信息。你可以通过查询这些表来分析 MySQL 的性能问题。常用的系统表包括:

  • events_waits_current: 当前正在等待的事件。
  • events_waits_history: 最近的等待事件历史记录。
  • events_statements_current: 当前正在执行的 SQL 语句。
  • events_statements_history: 最近的 SQL 语句历史。
  • threads: 当前活动线程的信息。
  • users: 与用户相关的监控数据。
  • table_io_waits_summary_by_table: 每个表的 I/O 等待情况总结。
  • file_summary_by_instance: 文件实例的 I/O 统计。

(4)相关表介绍

1. 启用 Performance Schema
MySQL 启动时,需要在配置文件 my.cnf 中启用 Performance Schema默认情况下,许多 MySQL 版本已经开启了该功能,但某些系统可能需要手动开启:

[mysqld]
performance_schema = ON

重启 MySQL 服务后,你可以确认 Performance Schema 是否开启:

SHOW VARIABLES LIKE 'performance_schema';

2. 查看监控表
Performance Schema 使用数据库内的表存储监控信息。可以通过 USE performance_schema 来访问这些表。

> 你会看到大量的监控表,每张表记录着不同的系统信息。
USE performance_schema;
SHOW TABLES;

3. 监控等待事件
等待事件是性能问题的一个重要指示器。你可以查看哪些操作在等待资源(例如锁、I/O 等)。

> 这个查询显示了发生等待事件的不同类型和等待的总时间。
SELECT * FROM events_waits_summary_global_by_event_name
WHERE SUM_TIMER_WAIT > 0;

4. 监控 SQL 语句执行
要查看最近执行的 SQL 语句及其性能数据,可以查询 events_statements_history 表:

> 这将显示执行时间最长的最近五条查询,帮助你找出慢查询。
SELECT event_id, sql_text, timer_wait
FROM events_statements_history
ORDER BY timer_wait DESC
LIMIT 5;

5. 监控表 I/O
对于表级别I/O 问题,可以使用 table_io_waits_summary_by_table 表来查看各表的 I/O 情况。

这将列出 I/O 负载最重的表,帮助你识别需要优化的表。SELECT object_schema, object_name, count_read, count_write, sum_timer_read, sum_timer_write
FROM table_io_waits_summary_by_table
ORDER BY sum_timer_read DESC
LIMIT 10;

6. 监控锁和事务
锁冲突是导致数据库性能问题的重要原因之一。你可以使用 events_waits_history_long 表查看锁相关的信息。

该查询将显示等待最久的表锁,帮助你定位可能的锁冲突。SELECT event_id, object_type, object_name, timer_wait
FROM events_waits_history_long
WHERE object_type = 'TABLE'
AND object_name IS NOT NULL
ORDER BY timer_wait DESC
LIMIT 10;

7. 监控文件 I/O
文件 I/O 是数据库性能的另一大瓶颈。Performance Schema 提供了 file_summary_by_instance 表,用于监控文件层面的 I/O 操作。

这个查询显示了文件系统层面上读写操作最频繁的文件。SELECT file_name, count_read, count_write, sum_timer_read, sum_timer_write
FROM file_summary_by_instance
ORDER BY sum_timer_read DESC
LIMIT 10;

(5)使用实例

假设你遇到 MySQL 数据库性能下降的问题,下面是一种诊断步骤:

1. 检查等待事件: 查看哪些事件在等待较长时间,例如 I/O、锁等。


SELECT event_name, SUM_TIMER_WAIT
FROM events_waits_summary_global_by_event_name
WHERE SUM_TIMER_WAIT > 0
ORDER BY SUM_TIMER_WAIT DESC;

2. 检查最近的慢查询: 查看执行时间较长的 SQL 语句。


SELECT sql_text, timer_wait
FROM events_statements_history
ORDER BY timer_wait DESC
LIMIT 5;

3. 分析表的I/O情况: 找出 I/O 负载较高的表,可能需要优化索引或查询。


SELECT object_schema, object_name, count_read, count_write
FROM table_io_waits_summary_by_table
ORDER BY sum_timer_wait DESC
LIMIT 5;

4. 监控文件 I/O: 确认是否有文件系统瓶颈。


SELECT file_name, count_read, count_write, sum_timer_read, sum_timer_write
FROM file_summary_by_instance
ORDER BY sum_timer_wait DESC
LIMIT 5;



Performance Schema 和其他工具的对比

  • SHOW PROFILE: 简单易用,但只适合分析单个查询的执行性能
    Performance Schema 则是全局的、实时的监控工具,可以提供更多维度的性能数据。

  • EXPLAIN: 主要用于 显示查询的执行计划,帮助用户理解查询优化器如何选择索引及执行路径;
    Performance Schema 则侧重于运行时的实际性能分析


总结
Performance SchemaMySQL 的高级性能监控工具,可以帮助用户深入了解系统的运行状况。通过对等待事件、SQL 语句、锁定、I/O 等关键领域的监控,用户可以迅速定位数据库的性能瓶颈,并进行针对性的优化。它比 SHOW PROFILEEXPLAIN 更加全面,适用于复杂的性能调优和监控任务。

五、(了解)全局查询日志(General Query Log)

全局查询日志(General Query Log)MySQL用于记录服务器接收到的每一个SQL语句和管理命令的日志工具。它非常适合用来调试和监控数据库的所有活动,无论查询是否或失败都可以记录下来。虽然它可以帮助了解数据库内部正在发生的操作,但由于它的高开销,不建议在高负载生产环境中长期启用

  • 永远不要在生产环境开启这个功能

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关文章:

Mysql高级篇(中)—— SQL优化之查询截取分析

SQL优化之查询截取分析 一、慢查询日志(1)简述(2)如何开启(3)慢查询日志分析工具介绍(了解)(4)官方工具 mysqldumpslow简述如何使用 二、SHOW PROCESSLIST三、(了解&…...

企业如何制作一个官方网站?

随着实体宣传的减弱,提高线上的宣传是新式的宣传方式,那么企业搭建网站成为线上宣传的重要途径。企业如何去搭建网站呢?如何拥有一个专业的网站来展示企业文化和企业销售产品?今天我给大家带来干货:如何一步步构建自己…...

游戏开发2025年最新版——八股文面试题(unity,虚幻,cocos都适用)

1.静态合批与动态合批的原理是什么?有什么限制条件?为什么?对CPU和GPU产生的影响分别是什么? 原理:Unity运行时可以将一些物体进行合并,从而用一个描绘调用来渲染他们,就是一个drawcall批次。 限…...

如何查看线程

1、首先找到我们的电脑安装jdk的位置,这里给大家展示一下博主本人的电脑jdk路径下的jconsole位置。 2、 ok,那么找到这个jconsole程序我们直接双击打开就可以查看我们电脑的本地进程: jconsole 这里能够罗列出你系统上的 java 进程&#xff0…...

详细分析Spring的动态代理机制

文章目录 1. JDK动态代理和CGLIB动态代理的区别1.1 适用范围1.2 生成的代理类1.3 调用方式 2. 问题引入3. 创建工程验证 Spring 默认采用的动态代理机制3.1 引入 Maven 依赖3.2 UserController.java3.3 UserService.java3.4 UserServiceImpl.java(save方法添加了Tra…...

Redis数据类型,使用场景,事物及分布式锁

文章目录 关于Redis1.常用数据类型1.字符串(String)2.哈希(Hash)3.列表(List)4.集合(Set)5.有序集合(Sorted Set)6.位图(Bitmap)7.超日…...

目标检测系列(一)什么是目标检测

目录 一、相关名词解释 二、目标检测算法 三、目标检测模型 四、目标检测应用 五、目标检测数据集 六、目标检测常用标注工具 一、相关名词解释 关于图像识别的计算机视觉四大类任务: 分类(Classification):解决“是什么&…...

STM32CubeIDE | 使用HAL库的ADC读取内部传感器温度

1、cubemx配置 1.1、系统配置 1.2、GPIO配置 PB2设置为“GPIO_Output” user label设置为“LED” 1.3、串口配置 模式选择为“Asynchronous”,其他默认 1.4、时钟树配置 全部保持默认 2、ADC配置 通道选择“Temperature Sensor Channel”,其他默认 …...

茶思屋直播|TinyEngine+AI:聚焦主航道,在实践中探索低代码技术黑土地

低代码引擎使能开发者定制低代码平台。它是低代码平台的底座,提供可视化搭建页面等基础能力,既可以通过线上搭配组合,也可以通过cli创建个人工程进行二次开发,实时定制出自己的低代码平台。适用于多场景的低代码平台开发&#xff…...

Ansible流程控制-条件_循环_错误处理_包含导入_块异常处理

文章目录 Ansible流程控制介绍1. 条件判断2. 循环3. 循环控制4. 错误处理5. 包含和导入6. 块和异常处理7. 角色的流程控制*include_tasks、import_tasks_include之间的区别 条件语句再细说且、或、非、是模糊条件when指令的详细使用方法 循环语句再细说如何使用使用item变量结合…...

Mybatis-为什么使用Mybatis,它存在哪些优点和缺点?

优点: 基于 SQL 语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL单独写,解除SQL与程序代码的耦合,便于统⼀管理。与 JDBC 相比,减少了 50%以上的代码量,消除…...

银河麒麟高级服务器操作系统V10外接硬盘挂载指南

银河麒麟高级服务器操作系统V10外接硬盘挂载指南 1、临时挂载外接硬盘2、永久挂载外接硬盘3、总结 💖The Begin💖点点关注,收藏不迷路💖 在使用银河麒麟高级服务器操作系统V10时,您可能希望将外接硬盘(如sd…...

免费制作证件照的小程序源码

1、效果展示 证件照制作,证件照免费制作,证件照调用api源码,解析代码。证件照制作小程序包,可以下载程序包,最初级版本免费下载。以上是高级版本。如果你有开发能力的话可以自己写前端,然后以下调用以下api…...

面经宝典【1】-拼多多

这个专题我主要想的是吧这些面经题目给整合起来,自己时不时可以看看然后回答回答,然后再根据一些面经去查漏补缺,具体的答案我都记录在在自己的语雀笔记当中,如果想要的可以私聊我,当然这些答案一般在网上都能找到。 今…...

AI画图用到的网站与资源

1、画图 爱灯泡 midjourney官网 可以使用stable-diffusion的网站 2、素材 花瓣 figma 3、...

C++——多线程编程(从入门到放弃)

进程:运行中的程序 线程:进程中的进程 线程的最大数量取决于CPU的核心数 一、将两个函数添加到不同线程中 demo:两个函数test01()和test02(),实现将用户输入的参数进行打印输出1000次 将这两个函数均放到独立的线程t1和t2中&…...

江协科技STM32学习- P14 示例程序(定时器定时中断和定时器外部时钟)

🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝​…...

2024年CSP-J认证 CCF信息学奥赛C++ 中小学初级组 第一轮真题-阅读程序题解析

2024 CCF认证第一轮&#xff08;CSP-J&#xff09;真题 二、阅读程序题 (程序输入不超过数组或字符串定义的范围&#xff0c;判断题正确填√错误填X;除特殊说明外&#xff0c;判断题 1.5分&#xff0c;选择题3分&#xff0c;共计40 分) 第一题 01 #include <iostream>…...

Hive ROW_NUMBER() 简介

在 Apache Hive 中&#xff0c;ROW_NUMBER() 是一个窗口函数&#xff0c;常用于为查询结果中的每一行生成唯一的行号。它在 SQL 查询结果集中按照指定的排序规则对每一行进行编号。ROW_NUMBER() 的实现依赖于 Hive 的分布式执行框架和排序机制。 为了理解 ROW_NUMBER() 的底层实…...

java是干什么的

Java 是一种广泛使用的编程语言&#xff0c;主要用于以下几个方面&#xff1a; Web 开发&#xff1a;Java 可以用于创建动态网页和 Web 应用程序&#xff0c;常见的框架有 Spring 和 JavaServer Faces&#xff08;JSF&#xff09;。 企业级应用&#xff1a;Java 被广泛应用于…...

AI与量化投资人才培养计划-连接职场 助力走在金融行业前沿

AI与量化投资人才培养计划-连接职场 助力走在金融行业前沿 人工智能&#xff08;AI&#xff09;的快速发展&#xff0c;量化投资已逐渐成为金融行业的新趋势&#xff0c;对专业人才的需求日益迫切。本文将深入探讨一项针对AI与量化投资的人才培养计划&#xff0c;旨在为金融专业…...

《CUDA编程》2.CUDA中的线程组织

0 来自GPU的hello world 在visua studio 中新建一个CUDA runtime项目&#xff0c;然后把kernel.cu中的代码删掉&#xff0c;输入以下代码 #include"cuda_runtime.h" #include"device_launch_parameters.h"#include<stdio.h>__global__ void hello_…...

学习篇 | Dockerized GitLab 安装使用(简单实操版)

1. 详细步骤 1.1 安装启动 postgresql 服务 docker pull sameersbn/postgresql:14-20230628docker run --name gitlab-postgresql -d \--env DB_NAMEgitlabhq_production \--env DB_USERgitlab --env DB_PASSpassword \--env DB_EXTENSIONpg_trgm,btree_gist \--volume /srv/…...

Linux服务器磁盘扩容

文章目录 扩容挂载 扩容 [rootserver8 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sr0 11:0 1 1024M 0 rom vda 252:0 0 1T 0 disk ├─vda1 252:1 0 1G 0 par…...

Redis的一些数据类型(一)

&#xff08;一&#xff09;数据类型 我们说redis是key value键值对的方式存储数据&#xff0c;key是字符串&#xff0c;而value是一些数据结构,那今天就来说一下value存储的数据。 我们数据结构包含&#xff0c;String&#xff0c;hash&#xff0c;list&#xff0c;set和zest但…...

论文复现:考虑电网交互的风电、光伏与电池互补调度运行(MATLAB-Yalmip-Cplex全代码)

论文复现:考虑电网交互的风电、光伏与电池储能互补调度运行(MATLAB-Yalmip-Cplex全代码) 针对风电、光伏与电化学储能电站互补运行的问题,已有大量通过启发式算法寻优的案例,但工程上更注重实用性和普适性。Yalmip工具箱则是一种基于MATLAB平台的优化软件工具箱,被广泛应用…...

HTTP 协议介绍

基本介绍&#xff1a; HTTP&#xff08;Hyper Text Transfer Protocol&#xff09;&#xff1a; 全称超文本传输协议&#xff0c;是用于从万维网&#xff08;WWW:World Wide Web &#xff09;服务器传输超文本到本地浏览器的传送协议。 HTTP 是一种应用层协议&#xff0c;是基…...

解决windows上VMware的ubuntu虚拟机不能拷贝和共享

困扰多时的VMware虚拟机不能复制拷贝和不能看到共享文件夹的问题&#xff0c;终于解决了~ 首先确定你已经开启了复制拷贝和共享文件夹&#xff0c;并且发现不好用。。。 按照下面方式解决这个问题。 1&#xff0c;删除当前的vmware tools。 sudo apt-get remove --purge ope…...

Python+rust会是一个强大的组合吗?

今天想和大家讨论一个在技术圈子里越来越火的话题——Python和Rust的组合。 不少程序员都开始探索这两个语言的结合&#xff0c;希望能借助Python的简洁和Rust的高性能&#xff0c;来打造出既易用又强大的软件。 那么&#xff0c;这对CP&#xff08;编程组合&#xff09;真的…...

引用和指针的区别

引用&#xff08;reference&#xff09;和指针&#xff08;pointer&#xff09;都是 C 中用来间接访问内存中对象的机制&#xff0c;但它们有一些重要的区别。以下是它们在语法、用法和特性上的详细区别。 下面从7个方面来详细说明引用和指针的区别 1. 定义与语法区别 引用&…...