SQL优化之查询截取分析
- 一、慢查询日志
-
- (1)简述
- (2)如何开启
- (3)慢查询日志分析工具介绍(了解)
- [(4)官方工具 mysqldumpslow](#(4)官方工具 mysqldumpslow)
- [二、SHOW PROCESSLIST](#二、SHOW PROCESSLIST)
- [三、(了解)Show Profile](#三、(了解)Show Profile)
- [四、Performance Schema](#四、Performance Schema)
- [五、(了解)全局查询日志(General Query Log)](#五、(了解)全局查询日志(General Query Log))
一、慢查询日志
(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)相关表介绍
- 启用
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数据库性能下降的问题,下面是一种诊断步骤:
- 检查等待事件: 查看哪些事件在等待较长时间,例如
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;
- 检查最近的慢查询: 查看执行时间较长的
SQL语句。
sql
SELECT sql_text, timer_wait
FROM events_statements_history
ORDER BY timer_wait DESC
LIMIT 5;
- 分析表的
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;
- 监控文件
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语句和管理命令的日志工具 。它非常适合用来调试和监控数据库的所有活动,无论查询是否或失败都可以记录下来。虽然它可以帮助了解数据库内部正在发生的操作,但由于它的高开销,不建议在高负载生产环境中长期启用 。
永远不要在生产环境开启这个功能



