mysql 8.0 一条insert语句的具体执行流程分析(三)
代码版本:mysql 8.0.22
编程语言:c++ && c++11 && c++14 && c++17
上一篇文章:mysql 8.0 一条insert语句的具体执行流程分析(二)_一缕阳光的博客-CSDN博客
主要介绍了存储引擎部分,这个章节主要介绍insert一条语句时有二级索引时需要调用哪些接口,调用接口的顺序如下:
下面的接口基本上看源码就能理解,不再重述。
下面以聚集索引和二级索引为例,聚集索引调用接口如下:
| > row_ins_clust_index_entry
| | > row_ins_clust_index_entry_low
| | | > btr_cur_optimistic_insert
| | | | > btr_cur_ins_lock_and_undo
| | | | | > trx_undo_report_row_operation
| | | | | | > trx_undo_page_report_insert
| | | | | | | > trx_undo_page_set_next_prev_and_add
| | | | | | | | > trx_undof_page_add_undo_rec_log| | | | > page_cur_tuple_insert
| | | | | > rec_convert_dtuple_to_rec> rec_convert_dtuple_to_rec_new> rec_convert_dtuple_to_rec_old> rec_convert_dtuple_to_rec_comp| | | | | > page_cur_insert_rec_low> page_cur_insert_rec_write_log
(12)、row_ins_clust_index_entry : 插入entry到一个聚集索引,会调用13中的接口
(13)、row_ins_clust_index_entry_low : 尝试将entry插入到聚集索引中,忽略外键约束。
(14)、btr_cur_optimistic_insert : 插入一个page到一个索引tree
(15)、btr_cur_ins_lock_and_undo : 检查lock和写undo log
(16)、page_cur_tuple_insert : 将一条record追加到当前page,需要与17中的函数完成
(17)、page_cur_insert_rec_low : 将一条record追加到当前page,以非压缩方式写入
二级索引调用接口如下:
| > row_ins_sec_index_entry
| | > row_ins_sec_index_entry_low
| | | > btr_cur_search_to_nth_level> ibuf_should_try
| | | > row_ins_scan_sec_index_for_duplicate
(18)、row_ins_sec_index_entry : 在二级索引中插入entry
(19)、row_ins_sec_index_entry_low : 尝试将entry插入二级索引。如果找到一个字段完全相同的记录,则必须将另一个记录标记为已删除,然后再插入到二级索引中
(20)、btr_cur_search_to_nth_level : 在索引tree中给定的level上找到当前位置
(21)、row_ins_scan_sec_index_for_duplicate : 扫描给定索引项处的唯一非聚集索引,以确定该项的键值是否发生唯一性冲突。对可能重复的记录设置共享锁
最后,所有断点都被执行之后,使用bt命令将堆栈信息打印出来,由于断点太多了,打印了主要的一些函数,如下:
(gdb) bt
#0 btr_cur_optimistic_insert (flags=0, cursor=0x7fffe83d4ae0, offsets=0x7fffe83d4a78, heap=0x7fffe83d4a70, entry=0x7fff300cb370, rec=0x7fffe83d4a80, big_rec=0x7fffe83d4a68, thr=0x7fff3029c6f8, mtr=0x7fffe83d50a0)at /storage/innobase/btr/btr0cur.cc:2833
#1 0x000055555a4c7571 in row_ins_clust_index_entry_low (flags=0, mode=2, index=0x7fff3028a640, n_uniq=1, entry=0x7fff300cb370, thr=0x7fff3029c6f8, dup_chk_only=false)at storage/innobase/row/row0ins.cc:2518
#2 0x000055555a4c945c in row_ins_clust_index_entry (index=0x7fff3028a640, entry=0x7fff300cb370, thr=0x7fff3029c6f8, dup_chk_only=false)at /storage/innobase/row/row0ins.cc:3097
#3 0x000055555a4c9c14 in row_ins_index_entry (index=0x7fff3028a640, entry=0x7fff300cb370, multi_val_pos=@0x7fff3029c3f8: 0, thr=0x7fff3029c6f8)at /storage/innobase/row/row0ins.cc:3289
#4 0x000055555a4ca26f in row_ins_index_entry_step (node=0x7fff3029c338, thr=0x7fff3029c6f8)at /storage/innobase/row/row0ins.cc:3425
#5 0x000055555a4ca616 in row_ins (node=0x7fff3029c338, thr=0x7fff3029c6f8)at /storage/innobase/row/row0ins.cc:3544
#6 0x000055555a4caa92 in row_ins_step (thr=0x7fff3029c6f8)at /storage/innobase/row/row0ins.cc:3668
#7 0x000055555a4ea804 in row_insert_for_mysql_using_ins_graph (mysql_rec=0x7fff302892c8 "\376\005", prebuilt=0x7fff3029b830) at /storage/innobase/row/row0mysql.cc:1581
#8 0x000055555a4eae9a in row_insert_for_mysql (mysql_rec=0x7fff302892c8 "\376\005", prebuilt=0x7fff3029b830) at /storage/innobase/row/row0mysql.cc:1711
#9 0x000055555a2a9ad9 in ha_innobase::write_row (this=0x7fff30287bf8, record=0x7fff302892c8 "\376\005")at /storage/innobase/handler/ha_innodb.cc:8629
#10 0x0000555558d4ace2 in handler::ha_write_row (this=0x7fff30287bf8, buf=0x7fff302892c8 "\376\005")at /sql/handler.cc:7831
#11 0x00005555590a14a7 in write_record (thd=0x7fff30001040, table=0x7fff30287270, info=0x7fffe83d64f0, update=0x7fffe83d6570) at /sql/sql_insert.cc:2148
#12 0x000055555909cb7e in Sql_cmd_insert_values::execute_inner (this=0x7fff302becc8, thd=0x7fff30001040)at /sql/sql_insert.cc:633
#13 0x00005555589ff8fc in Sql_cmd_dml::execute (this=0x7fff302becc8, thd=0x7fff30001040)at /sql/sql_select.cc:612
#14 0x000055555897bd6e in mysql_execute_command (thd=0x7fff30001040, first_level=true)at /sql/sql_parse.cc:3420
#15 0x00005555589810b9 in dispatch_sql_command (thd=0x7fff30001040, parser_state=0x7fffe83d7b90)at /sql/sql_parse.cc:4988
#16 0x0000555558977226 in dispatch_command (thd=0x7fff30001040, com_data=0x7fffe83d8b80, command=COM_QUERY) at /sql/sql_parse.cc:1836
#17 0x00005555589756df in do_command (thd=0x7fff30001040)at /sql/sql_parse.cc:1320
#18 0x0000555558b6ee3d in handle_connection (arg=0x55556006bbe0)at /sql/conn_handler/connection_handler_per_thread.cc:301
#19 0x000055555aa337b6 in pfs_spawn_thread (arg=0x55555fee7ae0)at /storage/perfschema/pfs.cc:2900
--Type <RET> for more, q to quit, c to continue without paging--
#20 0x00007ffff7f95609 in start_thread (arg=<optimized out>) at pthread_create.c:477
#21 0x00007ffff76e0293 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
到此为止,在MySQL中insert一条record的基本过程已经梳理完毕,流程还是比较清晰的,有数据库初级经验的基本都能理清楚。
接下来几篇文章主要讲述MySQL中redo.log中的mtr。
mysql 8.0 一条insert语句的具体执行流程分析(三)相关推荐
- mysql 8.0 一条insert语句的具体执行流程分析(二)
继续上一篇文章:mysql 8.0 一条insert语句的具体执行流程分析(一)_一缕阳光的博客-CSDN博客 由于最近换工作一直在试用期内,在拼命的学习.总结中,因此没有时间写文章,今天转正了腾出来 ...
- mysql 8.0 一条insert语句的具体执行流程分析(一)
最近在mysql 8.0的代码上开发新的功能的时候,梳理了insert语句的执行过程,由于insert语句比较复杂并且涉及的内容很多,在下面准备分3章节来分析,这是第一个章节,主要讲述sql解析和命令 ...
- mysql数据库使用一条insert语句同时插入多条数据
我们常见的MySQL数据库插入数据的方法是insert语句,例如: INSERT INTO student(name,no,age,address) VALUES ('张三','1001',20,'上 ...
- 一条insert语句导致的性能问题分析(一)
今天早上开发找我看一个问题,说他们通过程序连接去查一个表的数据的时候,只查到了8条记录,这个情况着实比较反常,因为从业务上的数据情况来说,不可能只有8条. 但是开发没有太多的权限做线上环境的数据检查, ...
- 在MySQL中,一条查询语句是如何执行的
MySQL 基本架构示意图 大体来说,MySQL 可以分为 Server 层和存储引擎层两部分: Server 层 包括连接器.查询缓存.分析器.优化器.执行器等,涵盖 MySQL 的大多数核心服务功 ...
- mysql中,一条select语句是如何执行的?
接下来通过语句弄明白整个Select语句的内部运行状态: 连接器: Mysql>mysql -uroot -p 你首先连接到这个数据库上:链接器负责跟客户端建立连接,获取权限,维持和管理连接 ● ...
- MySQL中:一条update语句是怎样执行的
- mysql上一条语句成功_mysql : 获取上一条insert语句
在一些项目中 , 经常接触分表 . 比如 : 商品信息 和 商品的详情 , 是分开的两个表 . dt_mall和dt_mall_content; 当我dt_mall插入一条数据的时候 , 如果插入成功 ...
- mysql 查询语句_MySQL相关(一)- 一条查询语句是如何执行的
前言 学习一个新知识最好的方式就是上官网,所以我先把官网贴出来 MySQL官网 (点击查阅),如果大家有想了解我没有说到的东西可以直接上官网看哈~目前 MySQL 最新大版本为8.0,但是鉴于目前应用 ...
最新文章
- 检查企业的销售和分销结构
- 怎么用c语言做出等妖三角形_初二数学培优,怎么用顶点坐标求三角形面积?割补法这样用很简单...
- 一个半月快速、低成本上云,云数据库专属集群解决方案看过来
- github上的优秀项目和开发环境配置【转http://www.cnblogs.com/2018/archive/2012/11/09/2763119.html】...
- python列表_Python列表抽象
- C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper(二)
- Cuba studio框架中使用thymeteaf模板时中文乱码
- 被动语态和非谓语区别_语法考点:非谓语动词!
- 算法设计与分析(1)——基础知识
- unity 创建中文自定义字体
- word字体放大后只显示一半_word字体显示不全或是显示一半怎么回事如何解决
- 使用PS2019制作明信片
- ios textView输入框光标问题
- Q4财报净亏损8350.2万美元,Unity何时摆脱亏损“魔咒”?
- IE报证书错误提示页面,如何屏蔽?
- Bootstrap官网的Bootstrap 3 字体图标的使用测试
- python误差修正模型_误差修正模型ECM_eviews误差修正模型
- 窗口看门狗与独立看门狗区别
- 那些出现在电影中的程序代码
- 爬虫技术——一篇全搞定!