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
语句和管理命令的日志工具 。它非常适合用来调试和监控数据库的所有活动
,无论查询是否或失败都可以记录下来。虽然它可以帮助了解数据库内部正在发生的操作,但由于它的高开销,不建议在高负载生产环境中长期启用 。
永远不要在生产环境开启这个功能