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

简述

mysqldumpslowMySQL官方自带的一个简单的命令行工具,用于分析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 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 版本已经开启了该功能,但某些系统可能需要手动开启:

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

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

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

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




相关推荐
heater4048 分钟前
【Linux】驱动的基本架构和编译
linux·driver
尘浮生11 分钟前
Java项目实战II基于Java+Spring Boot+MySQL的植物健康系统(开发文档+源码+数据库)
java·开发语言·数据库·spring boot·mysql·maven·intellij-idea
YUNBEE_chen12 分钟前
ansible批量安装postgresql软件
数据库·postgresql·ansible
一名技术极客14 分钟前
Linux安装go-fastdfs
linux·运维·golang
小阿轩yx16 分钟前
小阿轩yx-Ansible部署与应用基础
linux·云计算·ansible·运维开发·云平台管理·部署应用
会洗碗的CV工程师34 分钟前
828华为云征文——使用Flexus云服务器X实例CentOS镜像下创建MySQL服务器教程
运维·服务器·mysql·centos·华为云
A乐神35 分钟前
Django 对数据库的增删改查
数据库·django·sqlite
bug菌¹42 分钟前
lettuce连接哨兵redis,主从切换异常,如何解决??
数据库·spring boot·redis·bootstrap
噼里啪啦啦.1 小时前
阻塞队列(多线程)
java·开发语言·数据库
抹茶生活2 小时前
Face++API调用
java·开发语言·数据库