导读:本期聚焦于小伙伴创作的《mysql如何排查SQL执行过程中的磁盘I/O异常 使用iostat配合慢日志分析》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《mysql如何排查SQL执行过程中的磁盘I/O异常 使用iostat配合慢日志分析》有用,将其分享出去将是对创作者最好的鼓励。

在mysql数据库运行过程中,磁盘I/O异常往往会直接导致SQL执行效率下降,甚至引发整个业务系统的响应延迟。要精准定位这类问题,结合iostat工具和mysql慢日志是最常用且高效的排查方案,能够从不同维度还原SQL执行时的磁盘负载情况。

mysql如何排查SQL执行过程中的磁盘I/O异常 使用iostat配合慢日志分析

排查前的准备工作

首先需要确保mysql慢日志功能已开启,同时系统层面安装了sysstat工具包(包含iostat命令)。如果是Linux系统,可以通过下面的命令安装sysstat:

# centos系统安装命令
yum install -y sysstat
# ubuntu系统安装命令
apt-get install -y sysstat

接着检查mysql的慢日志配置,执行以下SQL查看相关参数:

-- 查看慢日志是否开启
SHOW VARIABLES LIKE 'slow_query_log';
-- 查看慢日志阈值,单位秒,执行时间超过该值的SQL会被记录
SHOW VARIABLES LIKE 'long_query_time';
-- 查看慢日志文件路径
SHOW VARIABLES LIKE 'slow_query_log_file';

如果慢日志未开启,可以通过下面的SQL临时开启,永久生效需要修改my.cnf配置文件:

-- 开启慢日志
SET GLOBAL slow_query_log = 'ON';
-- 设置慢查询阈值为1秒,可根据实际需求调整
SET GLOBAL long_query_time = 1;

使用iostat采集磁盘I/O指标

iostat可以实时展示磁盘的读写负载情况,常用的执行命令如下:

# 每2秒输出一次磁盘I/O统计结果,共输出10次
iostat -x 2 10

输出结果中需要重点关注以下几个指标:

  • %util:磁盘利用率,值越接近100%说明磁盘处于满负载状态,I/O压力极大
  • rkB/s:每秒读取的数据量,单位KB
  • wkB/s:每秒写入的数据量,单位KB
  • await:I/O请求的平均等待时间,包含队列等待时间和实际处理时间,单位毫秒,值越高说明I/O响应越慢
  • svctm:I/O请求的平均服务时间,单位毫秒,反映磁盘本身的处理能力

当观察到%util持续处于高位、await数值远高于svctm时,就可以确定当前磁盘存在I/O异常,需要进一步定位对应的SQL语句。

分析mysql慢日志定位问题SQL

慢日志文件中会记录所有执行时间超过阈值的SQL,以及对应的执行信息,我们可以通过mysql自带的mysqldumpslow工具分析慢日志:

# 按照查询时间倒序排序,输出前10条最慢的SQL
mysqldumpslow -s t -t 10 /var/lib/mysql/slow.log

慢日志的每条记录包含以下核心信息:

字段说明
Query_timeSQL总执行时间,单位秒
Lock_timeSQL等待锁的时间,单位秒
Rows_sent返回给客户端的行数
Rows_examinedSQL执行过程中扫描的行数,该值越大越容易触发大量磁盘I/O
SQL语句实际执行的SQL内容

重点关注Rows_examined数值过高的SQL,这类SQL往往因为没有合适的索引,需要全表扫描或者扫描大量行,会触发频繁的磁盘读写操作。

结合两者关联排查的完整流程

实际排查时可以按照下面的步骤完成关联分析:

  1. 先通过iostat持续监控磁盘I/O指标,记录I/O异常发生的时间段
  2. 到慢日志中筛选对应时间段内记录的慢SQL
  3. 分析这些SQL的执行计划,查看是否存在全表扫描、索引失效的情况
  4. 对问题SQL进行优化,比如添加合适的索引、调整查询条件、拆分大查询等
  5. 优化后再次通过iostat观察磁盘I/O指标,确认异常是否消失

下面是一个查看SQL执行计划的示例,通过EXPLAIN命令可以判断索引使用情况:

-- 查看问题SQL的执行计划
EXPLAIN SELECT * FROM user_order WHERE create_time > '2024-01-01' AND status = 1;

如果执行计划中type字段为ALL,说明是全表扫描,需要对create_time或者status字段添加索引来减少磁盘扫描范围。

常见优化方案

针对排查到的磁盘I/O异常SQL,常用的优化方向包括:

  • 为查询条件、关联条件、排序字段添加合适的索引,避免全表扫描
  • 避免查询不需要的字段,不要使用SELECT *,减少不必要的数据读取
  • 大批量数据写入时采用批量提交的方式,减少频繁的磁盘刷写
  • 对于历史数据较多的表,可以进行分表或者归档,减少单表的数据量
  • 调整mysql的innodb_buffer_pool_size参数,让更多热点数据缓存在内存中,减少磁盘读取
注意:修改mysql配置参数后需要重启服务才能生效,生产环境操作前需要做好备份和评估,避免影响线上业务。

总结

排查mysql SQL执行过程中的磁盘I/O异常,核心是通过iostat获取磁盘的实时负载指标,再通过慢日志定位到具体的问题SQL,两者结合可以快速找到问题根源。优化后需要持续监控相关指标,确认优化效果,同时日常也需要定期分析慢日志,提前发现潜在的I/O风险,保障数据库的稳定运行。

mysqliostat慢日志磁盘I/O_异常修改时间:2026-06-18 22:33:59

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。