当MySQL处于"发送数据"状态时,它意味着什么?

use*_*414 148 mysql

如果Mysql查询是什么意思:

SHOW PROCESSLIST;
Run Code Online (Sandbox Code Playgroud)

在State列中返回"发送数据"?

我想这意味着查询已经执行,MySQL正在向客户端发送"结果"数据,但我想知道为什么它花了这么多时间(长达一个小时).

谢谢.

Qua*_*noi 227

这是一个非常误导的状态.它应该被称为"读取和过滤数据".

这意味着MySQL有一些数据存储在磁盘(或内存)中,而这些数据尚未被读取和发送.它可能是表本身,索引,临时表,排序输出等.

如果你有一个1M记录表(没有索引),你只需要一个记录,MySQL在扫描表时仍会输出状态为"发送数据",尽管它还没有发送任何东西.

  • 该文档进一步解释了推理很可能是因为大量时间进行磁盘访问:http://dev.mysql.com/doc/refman/5.0/en/general-thread-states.html (12认同)
  • 如果MySQL在使用99%CPU时"发送数据",磁盘I/O很少,该怎么办? (4认同)

小智 18

在这种状态:

该线程正在读取和处理SELECT语句的行,并将数据发送到客户端.

因为在此状态期间发生的操作倾向于执行 大量磁盘访问(读取).

这就是为什么它需要更多时间才能完成,因此在给定查询的生命周期中运行时间最长的状态也是如此.