总在sending data阶段耗时过多的sql语句,应该如何优化?

netxuning 2009-09-04 09:22:07
我的一条sql语句,索引都已经建立好了,没有任何的filesort,和临时表的操作,explain后显示的性能很不错!
一般来说是很快的,但是经过show profile cpu, block io for query n;的操作发现,有时候会在sending data耗时过多!
而且同一条sql语句不同时候在sending data这个阶段耗费的时间差距非常大,从不到一秒到十几秒不等,测试的时候并没有其它访问阻碍!

这样的情况应该从何处入手呢?
...全文
539 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
netxuning 2009-09-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 acmain_chm 的回复:]
| executing          | 0.000003 |
| Sending data      | 0.000167 |

Sending data 这一行的 0.000167 其实是 executing 到 Sending data 所花的时间。
[/Quote]

这是我sending data的一个列子,不知该如何看!



mysql> show profile cpu, block io for query 2;
+--------------------------------+-----------+-----------+------------+--------------+---------------+
| Status | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out |
+--------------------------------+-----------+-----------+------------+--------------+---------------+
| starting | 0.000017 | 0.000000 | 0.000000 | 0 | 0 |
| checking query cache for query | 0.000086 | 0.000000 | 0.000000 | 0 | 0 |
| Opening tables | 0.000017 | 0.000000 | 0.000000 | 0 | 0 |
| System lock | 0.000013 | 0.000000 | 0.000000 | 0 | 0 |
| Table lock | 0.000012 | 0.000000 | 0.000000 | 0 | 0 |
| init | 0.000030 | 0.000000 | 0.000000 | 0 | 0 |
| optimizing | 0.000031 | 0.000000 | 0.000000 | 0 | 0 |
| statistics | 0.000289 | 0.000000 | 0.000000 | 0 | 0 |
| preparing | 0.000023 | 0.000000 | 0.000000 | 0 | 0 |
| executing | 0.000004 | 0.000000 | 0.000000 | 0 | 0 |
| Sorting result | 0.000004 | 0.000000 | 0.000000 | 0 | 0 |
| Sending data | 12.169379 | 18.651165 | 4.117374 | 0 | 0 |
| end | 0.000010 | 0.000000 | 0.000000 | 0 | 0 |
| query end | 0.000004 | 0.000000 | 0.000000 | 0 | 0 |
| freeing items | 0.000605 | 0.001000 | 0.000000 | 0 | 0 |
| logging slow query | 0.000004 | 0.000000 | 0.000000 | 0 | 0 |
| logging slow query | 0.000039 | 0.000000 | 0.000000 | 0 | 0 |
| cleaning up | 0.000004 | 0.000000 | 0.000000 | 0 | 0 |
+--------------------------------+-----------+-----------+------------+--------------+---------------+
netxuning 2009-09-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 acmain_chm 的回复:]
| executing          | 0.000003 |
| Sending data      | 0.000167 |

Sending data 这一行的 0.000167 其实是 executing 到 Sending data 所花的时间。
[/Quote]

不是太明白,那 Sending data本身到底处于什么操作中呢?
ACMAIN_CHM 2009-09-04
  • 打赏
  • 举报
回复
| executing | 0.000003 |
| Sending data | 0.000167 |

Sending data 这一行的 0.000167 其实是 executing 到 Sending data 所花的时间。
netxuning 2009-09-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 acmain_chm 的回复:]
引用而且同一条sql语句不同时候在sending data这个阶段耗费的时间差距非常大,从不到一秒到十几秒不等,测试的时候并没有其它访问阻碍!


你的机器上是不是有其它的进程同时在占用磁盘?
[/Quote]

acmain版的意思是说,sending data主要受到系统IO的影响?
ACMAIN_CHM 2009-09-04
  • 打赏
  • 举报
回复
[Quote]而且同一条sql语句不同时候在sending data这个阶段耗费的时间差距非常大,从不到一秒到十几秒不等,测试的时候并没有其它访问阻碍![/Quote]


你的机器上是不是有其它的进程同时在占用磁盘?
vinsonshen 2009-09-04
  • 打赏
  • 举报
回复
那说明你的数据量大或磁盘IO慢或网络慢
netxuning 2009-09-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 vinsonshen 的回复:]
只返回合理的数据行的必要字段,避免用*查询返回记录。
[/Quote]

嗯,不过我这条sql确实没有 *
vinsonshen 2009-09-04
  • 打赏
  • 举报
回复
只返回合理的数据行的必要字段,避免用*查询返回记录。

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧