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

SQL优化之查询截取分析

一、慢查询日志

(1)简述

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

(2)如何开启

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

查看 慢查询日志是否开启

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

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

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]下的配置为永久生效

sql 复制代码
[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

简述

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


如何使用

常见使用示例

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

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



四、Performance Schema

(1)简述

Performance Schema 是 MySQL 中 用于监控和分析数据库性能的强大工具 ,它从 MySQL 5.5 开始引入,并逐渐取代了一些旧的性能分析工具,如 SHOW PROFILE。Performance 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 版本已经开启了该功能,但某些系统可能需要手动开启:

sql 复制代码
[mysqld]
performance_schema = ON

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

sql 复制代码
SHOW VARIABLES LIKE 'performance_schema';

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

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

3. 监控等待事件

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

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

4. 监控 SQL 语句执行

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

sql 复制代码
> 这将显示执行时间最长的最近五条查询,帮助你找出慢查询。
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 情况。

sql 复制代码
这将列出 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 表查看锁相关的信息。

sql 复制代码
该查询将显示等待最久的表锁,帮助你定位可能的锁冲突。

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 操作。

sql 复制代码
这个查询显示了文件系统层面上读写操作最频繁的文件。

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、锁等。
sql 复制代码
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;
  1. 检查最近的慢查询: 查看执行时间较长的 SQL 语句。
sql 复制代码
SELECT sql_text, timer_wait
FROM events_statements_history
ORDER BY timer_wait DESC
LIMIT 5;
  1. 分析表的I/O情况: 找出 I/O 负载较高的表,可能需要优化索引或查询。
sql 复制代码
SELECT object_schema, object_name, count_read, count_write
FROM table_io_waits_summary_by_table
ORDER BY sum_timer_wait DESC
LIMIT 5;
  1. 监控文件 I/O: 确认是否有文件系统瓶颈。
sql 复制代码
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 Schema 是 MySQL 的高级性能监控工具,可以帮助用户深入了解系统的运行状况。通过对等待事件、SQL 语句、锁定、I/O 等关键领域的监控,用户可以迅速定位数据库的性能瓶颈,并进行针对性的优化。它比 SHOW PROFILE 和 EXPLAIN 更加全面,适用于复杂的性能调优和监控任务。

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

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

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




相关推荐
未济5 天前
linux 配置环境变量
linux
傲世仙尊5 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
小白男神5 天前
MySQL进阶学习四(存储过程、游标、触发器)
mysql
这个DBA有点耶5 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G5 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备5 天前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
科创致远5 天前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
_艾伦 耶格尔.5 天前
进程间通信
linux
Liuqy-055 天前
Linux IO编程——静态库、动态库
linux
漂着的圆木5 天前
Agent 功能参与度:Copilot 怎么算
sql·数据分析·agent·githubcopilot·度量