MySQL处于“正在发送数据”状态是什么意思?


163

如果Mysql查询是什么意思?

SHOW PROCESSLIST;

在“状态”列中返回“发送数据”?

我想这意味着查询已经执行,MySQL正在向客户端发送“结果”数据,但是我想知道为什么它要花费这么多时间(最多一个小时)。

谢谢。


1
这意味着它正在将数据从其过程传输到客户端。如果您Sending data认为运行SHOW PROFILE之后需要花费一些时间,那么所消耗的时间实际上应该属于之前的步骤。
NB 2012年

不幸的是,我收到一条消息,“ SHOW PROFILE”功能已禁用,我必须使用“ enable-profiling”来构建MySQL。但是感谢您的答复。
user1345414'4

这是另一个问题。查询已经在内部完成,这是网络或总线等传输资源的问题吗?
user1345414 2012年

3
不,您没有在听.. Sending data显示为占用时间的原因是因为它是一个MySQL分析错误,显示的时间属于之前的步骤,应该是Executing query类似的东西。这仅意味着您的查询需要花费时间才能执行。Sending data除非您流传输数百兆字节的数据,否则通常步伐很快。
NB

3
也许可以将该问题重命名为“'发送数据'状态在MySQL中意味着什么”。查找问题将更加容易。

Answers:


249

这是一种令人误解的状态。它应该被称为“读取和过滤数据”。

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

如果您有一个1M记录表(无索引),而该表只需要一个记录MySQL,尽管该表尚未发送任何内容,但在扫描表时仍将其状态输出为“发送数据”。


12
进一步说明推理的文档很可能是由于花费大量时间进行磁盘访问:dev.mysql.com/doc/refman/5.0/en/general-thread-states.html
Matthew Kolb,

4
如果MySQL在使用99%CPU且磁盘I / O很少的情况下“发送数据”怎么办?
rustyx

@RustyX数据已经存在于RAM中的缓冲区中,并且正在对约100k或1M的行进行排序?
sjas

23

在这种状态下:

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

因为在此状态下发生的操作往往会执行 大量磁盘访问(读取)

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.