文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

MySQL中sending data状态包含了什么

2024-04-02 19:55

关注

这篇文章主要介绍“MySQL中sending data状态包含了什么”,在日常操作中,相信很多人在MySQL中sending data状态包含了什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL中sending data状态包含了什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、问题由来

原问题如下:

要解决问题我们需要知道MySQL何时将数据传输给了客户端,既然是要传输实际的数据给客户端那么肯定是select语句了,同时我们要明白一个正常select运行到底要经历哪些阶段。

二、一个简单SELECT语句经历的阶段

  2392  T@10: | | | | | THD::enter_stage: 'checking permissions' /root/mysql5.7.14/percona-server-5.7.14-7/sql/auth/sql_authorization.cc:843
  2404  T@10: | | | | | | THD::enter_stage: 'Opening tables' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_base.cc:5719
  2512  T@10: | | | | | THD::enter_stage: 'init' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_select.cc:121
  2681  T@10: | | | | | | | THD::enter_stage: 'System lock' /root/mysql5.7.14/percona-server-5.7.14-7/sql/lock.cc:321
  2772  T@10: | | | | | | | THD::enter_stage: 'optimizing' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_optimizer.cc:151
  2865  T@10: | | | | | | | THD::enter_stage: 'statistics' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_optimizer.cc:386
  3329  T@10: | | | | | | | THD::enter_stage: 'preparing' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_optimizer.cc:494
  3466  T@10: | | | | | | THD::enter_stage: 'executing' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_executor.cc:119
  3474  T@10: | | | | | | THD::enter_stage: 'Sending data' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_executor.cc:195
  3668  T@10: | | | | | THD::enter_stage: 'end' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_select.cc:199
  3685  T@10: | | | | THD::enter_stage: 'query end' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_parse.cc:5174
  3754  T@10: | | | | THD::enter_stage: 'closing tables' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_parse.cc:5252
  3882  T@10: | | | THD::enter_stage: 'freeing items' /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_parse.cc:5855

实际上整个阶段都算到了语句的实际消耗时间之中的,但是慢查询记录的是:

关于慢查询的详细情况可以参考我的一篇文章,这里不再重述。

https://www.jianshu.com/p/1ffadf29d6c0  MySQL慢查询记录原理和内容解析

三、什么是Sending data状态

实际上这个状态是select语句才会有的,如果是DML则不同但是都有等同的阶段如下:

这个阶段非常的巨大,它至少包含了:

可以看到基本所有和Innodb层打交道的过程都包裹在这个状态下面,当然我只是列举了我想到的一些,其实可能还有很多很多,这里我也把 MySQL 层发送数据给客户端包含在 Sending data的答案给出了,下面我们进行分析。

四、如何证明Sending data状态包含了网络数据传输的时间

之前你可以参考一下我的文章

https://www.jianshu.com/p/25fed8f1f05e  MySQL:Innodb Handler_read_*变量解释

我们建立一个简单的表如下,并且填充数据如下:

Create Table: CREATE TABLE `ty` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `a` int(11) DEFAULT NULL,  `b` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idxa` (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4
mysql> select * from ty;
+----+------+------+| id | a    | b    |+----+------+------+|  8 |    2 |    3 ||  9 |    5 |    4 || 10 |    6 |    7 || 11 |    6 |    8 |+----+------+------+4 rows in set (4.14 sec)

我们执行如下语句:

mysql> desc select * from ty where a =6 and b=8;
+----+-------------+-------+------------+------+---------------+------+---------+-------+------+----------+-------------+| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref   | rows | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+-------+------+----------+-------------+
|  1 | SIMPLE      | ty    | NULL       | ref  | idxa          | idxa | 5       | const |    2 |    33.33 | Using where |+----+-------------+-------+------------+------+---------------+------+---------+-------+------+----------+-------------+
mysql> select * from ty where a =6 and b=8;
+----+------+------+| id | a    | b    |+----+------+------+| 11 |    6 |    8 |+----+------+------+1 row in set (7.22 sec)

注意:这里的语句执行时间很长是因为我打了GDB断点所以看起来很久而已
我做了语句的trace,这个语句大概需要如下步骤:

   1547 T@12: | | | | | | | | >handler::ha_index_read_map   1548 T@12: | | | | | | | | | >index_read (这里进行初次访问索引定位)
   1552 T@12: | | | | | | | | | | >row_search_mvcc
   1553 T@12: | | | | | | | | | | | >btr_cur_search_to_nth_level   1554 T@12: | | | | | | | | | | | <btr_cur_search_to_nth_level 2009
...
   1593 T@12: | | | | | | | | | | <row_search_mvcc 6070
   1594 T@12: | | | | | | | | | <index_read 9179
   1595 T@12: | | | | | | | | <handler::ha_index_read_map 3190
   1596 T@12: | | | | | | | | >evaluate_join_record (这里进入MySQL 层where条件判断流程,不满足不发送)
...   1600 T@12: | | | | | | | | <evaluate_join_record 1701
  1601 T@12: | | | | | | | | >handler::ha_index_next_same(这里就是顺序访问索引的下一行数据了)   1602 T@12: | | | | | | | | | >general_fetch
   1603 T@12: | | | | | | | | | | >row_search_mvcc
   ....
   1607 T@12: | | | | | | | | | | <row_search_mvcc 6070
   1608 T@12: | | | | | | | | | <general_fetch 9487
   1609 T@12: | | | | | | | | <handler::ha_index_next_same 3414
   1610 T@12: | | | | | | | | >evaluate_join_record(这里进入MySQL 层where条件判断流程,满足条件需要发送)   1613 T@12: | | | | | | | | | >end_send
   1614 T@12: | | | | | | | | | | >Query_result_send::send_data(这里就是发送数据给客户端了,也就是通过网络发送数据给客户端了)
   1615 T@12: | | | | | | | | | | | >send_result_set_row   1616 T@12: | | | | | | | | | | | <send_result_set_row 4967
   1620 T@12: | | | | | | | | | | <Query_result_send::send_data 2915
   1621 T@12: | | | | | | | | | | >Protocol_classic::end_row
   1622 T@12: | | | | | | | | | | <Protocol_classic::end_row 1198
   1625 T@12: | | | | | | | | | <end_send 2991
   1626 T@12: | | | | | | | | <evaluate_join_record 1701
   1627 T@12: | | | | | | | | >handler::ha_index_next_same(这里就是顺序访问索引的下一行数据了)   1628 T@12: | | | | | | | | | >general_fetch
   1629 T@12: | | | | | | | | | | >row_search_mvcc
  ...
   1639 T@12: | | | | | | | | | | <row_search_mvcc 6070
   1640 T@12: | | | | | | | | | <general_fetch 9487
   1641 T@12: | | | | | | | | <handler::ha_index_next_same 3414

所以总结整个流程一共经历了一次索引定位,两次索引顺序读取,一共读取了三条数据,但是返回给MySQL层的只有前面两条数据,通过MySQL层的过滤只发送给了客户端一条满足条件的数据。

到此,关于“MySQL中sending data状态包含了什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯