代码版本: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语句的具体执行流程分析(三)相关推荐

  1. mysql 8.0 一条insert语句的具体执行流程分析(二)

    继续上一篇文章:mysql 8.0 一条insert语句的具体执行流程分析(一)_一缕阳光的博客-CSDN博客 由于最近换工作一直在试用期内,在拼命的学习.总结中,因此没有时间写文章,今天转正了腾出来 ...

  2. mysql 8.0 一条insert语句的具体执行流程分析(一)

    最近在mysql 8.0的代码上开发新的功能的时候,梳理了insert语句的执行过程,由于insert语句比较复杂并且涉及的内容很多,在下面准备分3章节来分析,这是第一个章节,主要讲述sql解析和命令 ...

  3. mysql数据库使用一条insert语句同时插入多条数据

    我们常见的MySQL数据库插入数据的方法是insert语句,例如: INSERT INTO student(name,no,age,address) VALUES ('张三','1001',20,'上 ...

  4. 一条insert语句导致的性能问题分析(一)

    今天早上开发找我看一个问题,说他们通过程序连接去查一个表的数据的时候,只查到了8条记录,这个情况着实比较反常,因为从业务上的数据情况来说,不可能只有8条. 但是开发没有太多的权限做线上环境的数据检查, ...

  5. 在MySQL中,一条查询语句是如何执行的

    MySQL 基本架构示意图 大体来说,MySQL 可以分为 Server 层和存储引擎层两部分: Server 层 包括连接器.查询缓存.分析器.优化器.执行器等,涵盖 MySQL 的大多数核心服务功 ...

  6. mysql中,一条select语句是如何执行的?

    接下来通过语句弄明白整个Select语句的内部运行状态: 连接器: Mysql>mysql -uroot -p 你首先连接到这个数据库上:链接器负责跟客户端建立连接,获取权限,维持和管理连接 ● ...

  7. MySQL中:一条update语句是怎样执行的

  8. mysql上一条语句成功_mysql : 获取上一条insert语句

    在一些项目中 , 经常接触分表 . 比如 : 商品信息 和 商品的详情 , 是分开的两个表 . dt_mall和dt_mall_content; 当我dt_mall插入一条数据的时候 , 如果插入成功 ...

  9. mysql 查询语句_MySQL相关(一)- 一条查询语句是如何执行的

    前言 学习一个新知识最好的方式就是上官网,所以我先把官网贴出来 MySQL官网 (点击查阅),如果大家有想了解我没有说到的东西可以直接上官网看哈~目前 MySQL 最新大版本为8.0,但是鉴于目前应用 ...

最新文章

  1. 检查企业的销售和分销结构
  2. 怎么用c语言做出等妖三角形_初二数学培优,怎么用顶点坐标求三角形面积?割补法这样用很简单...
  3. 一个半月快速、低成本上云,云数据库专属集群解决方案看过来
  4. github上的优秀项目和开发环境配置【转http://www.cnblogs.com/2018/archive/2012/11/09/2763119.html】...
  5. python列表_Python列表抽象
  6. C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper(二)
  7. Cuba studio框架中使用thymeteaf模板时中文乱码
  8. 被动语态和非谓语区别_语法考点:非谓语动词!
  9. 算法设计与分析(1)——基础知识
  10. unity 创建中文自定义字体
  11. word字体放大后只显示一半_word字体显示不全或是显示一半怎么回事如何解决
  12. 使用PS2019制作明信片
  13. ios textView输入框光标问题
  14. Q4财报净亏损8350.2万美元,Unity何时摆脱亏损“魔咒”?
  15. IE报证书错误提示页面,如何屏蔽?
  16. Bootstrap官网的Bootstrap 3 字体图标的使用测试
  17. python误差修正模型_误差修正模型ECM_eviews误差修正模型
  18. 窗口看门狗与独立看门狗区别
  19. 那些出现在电影中的程序代码
  20. 爬虫技术——一篇全搞定!

热门文章

  1. 安装 PrestaShop 1.6 - 详细的安装指南
  2. 使用phpunit新建项目
  3. Spring AOP 代理模式
  4. Diango博客--8.解锁博客侧栏
  5. python中的数学模块
  6. pvrect r语言 聚类_R语言实现KEGG通路富集可视化
  7. 数据库函数依赖及范式
  8. php pdo操作mysql_PHP操作数据库详细(PDO)
  9. html5调用手机摄像头和相册,h5 调用手机摄像头/相册
  10. python ansys workbench联动_联合ANSYS WORKBENCH和经典界面进行后处理