如何在MySQL中定位SQL执行卡在Sending data状态的具体原因

梦伟酱_7476

梦伟酱_7476

2026-11-02

640人浏览

原创

卡在“Sending data”不是网络问题,而是MySQL正从存储引擎读取、组装数据,耗时主因是回表、大字段加载或Buffer Pool不足;需用SHOW FULL PROCESSLIST和SHOW PROFILE精确定位,并检查覆盖索引与innodb_buffer_pool_size配置。

如何在mysql中定位sql执行卡在sending data状态的具体原因

卡在 Sending data 不是网络问题,而是 MySQL 正在从存储引擎读取、组装并准备返回数据——真正耗时的环节往往藏在“回表”“大字段加载”或“Buffer Pool 不足”里。

用 SHOW FULL PROCESSLIST 快速确认是不是真卡住

别只看 SHOW PROCESSLIST,它默认截断 SQL 到 100 字符,关键 WHERE 条件可能被砍掉。必须加 FULL:

SHOW FULL PROCESSLIST;

重点关注三列:

  • State 是 Sending data 且 Time 持续上涨(>10 秒);
  • Command 是 Query,不是 Sleep 或 Connect;
  • Info 列里有没有 SELECT *、LIMIT 偏移很大、或明显没走索引的 JOIN。

如果 Time 几秒内就跳变,大概率只是中间状态;如果卡住不动又伴随 iostat -x 1 显示 %util 接近 100%,说明 I/O 真在扛不住。

用 SHOW PROFILE 精确定位 Sending data 耗在哪一环

EXPLAIN 只告诉你“计划怎么走”,看不出 Sending data 里实际花了多少时间在磁盘读、内存拷贝或行构造上。必须用 SHOW PROFILE:

MySQL8 CRM Schema Design Expert
MySQL8 CRM Schema Design Expert

面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。

下载
  • 先开启:SET profiling = ON;
  • 复现那条慢 SQL(确保是同一个会话);
  • 查 SHOW PROFILES; 拿到对应 Query_ID;
  • 再执行:SHOW PROFILE FOR QUERY N;(N 是你看到的 ID)

重点看两行:

  • Sending data 占比 >80%:基本排除网络,聚焦回表、大字段、Buffer Pool 不够;
  • Creating sort index 或 Coping to tmp table 高:说明 ORDER BY/GROUP BY 没走索引,或结果集太大撑爆内存。

检查是否因回表 + 大字段导致 I/O 爆炸

这是最常被忽略的点:Sending data 高耗时,90% 以上是因为 MySQL 找到索引 ID 后,还得一条条回主键 B+ 树把整行捞出来——尤其当 SELECT 包含 TEXT、BLOB 或超长 VARCHAR 时,哪怕只返回 10 行,每行几 KB,I/O 和内存压力就上来了。

  • 查执行计划:EXPLAIN 看 Extra 是否有 Using where; Using index(覆盖索引),还是只有 Using where(要回表);
  • 临时验证:把 SELECT * 改成只选 2–3 个关键字段,再跑一次 SHOW PROFILE,如果 Sending data 时间骤降,就是这个原因;
  • 长期解法:ALTER TABLE t ADD INDEX idx_cover (a,b,c),确保索引包含所有 SELECT 列;或者把大字段拆到扩展表,主表只留 ID 和标识字段。

别漏掉 innodb_buffer_pool_size 这个硬门槛

即使索引和 SQL 都没问题,如果 innodb_buffer_pool_size 设置太小(比如默认的 32M 或 128M),而你要查的表远大于这个值,MySQL 就得反复刷盘读页——Sending data 时间会直接和磁盘 I/O 绑定。

  • 查当前值:SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
  • 估算需覆盖的热数据量:用 SELECT table_schema, table_name, round(((data_length + index_length) / 1024 / 1024), 2) AS MB FROM information_schema.TABLES WHERE table_schema = 'your_db' ORDER BY MB DESC;
  • 调大原则:物理内存的 50%–75%,但别超过可用内存,否则触发 swap 更慢;
  • 改完必须重启 MySQL 生效,不能动态 SET。

很多线上事故里,Sending data 从 3 秒降到 0.3 秒,就靠这一项调整——但它掩盖了 SQL 和索引的问题,所以优先级排在回表和覆盖索引之后。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4683

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

971

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1229

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6681

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3423

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6660

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

9201

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1250

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1092

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 193人学习