东莞住房建设网站的网,网页文章 在wordpress,义乌百度网站制作,百度指数专业版app代码版本#xff1a;mysql 8.0.22
编程语言#xff1a;c c11 c14 c17
上一篇文章#xff1a;mysql 8.0 一条insert语句的具体执行流程分析(二)_一缕阳光的博客-CSDN博客
主要介绍了存储引擎部分#xff0c;这个章节主要介绍insert一条…代码版本mysql 8.0.22
编程语言c c11 c14 c17
上一篇文章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 (flags0, cursor0x7fffe83d4ae0, offsets0x7fffe83d4a78, heap0x7fffe83d4a70, entry0x7fff300cb370, rec0x7fffe83d4a80, big_rec0x7fffe83d4a68, thr0x7fff3029c6f8, mtr0x7fffe83d50a0)at /storage/innobase/btr/btr0cur.cc:2833
#1 0x000055555a4c7571 in row_ins_clust_index_entry_low (flags0, mode2, index0x7fff3028a640, n_uniq1, entry0x7fff300cb370, thr0x7fff3029c6f8, dup_chk_onlyfalse)at storage/innobase/row/row0ins.cc:2518
#2 0x000055555a4c945c in row_ins_clust_index_entry (index0x7fff3028a640, entry0x7fff300cb370, thr0x7fff3029c6f8, dup_chk_onlyfalse)at /storage/innobase/row/row0ins.cc:3097
#3 0x000055555a4c9c14 in row_ins_index_entry (index0x7fff3028a640, entry0x7fff300cb370, multi_val_pos0x7fff3029c3f8: 0, thr0x7fff3029c6f8)at /storage/innobase/row/row0ins.cc:3289
#4 0x000055555a4ca26f in row_ins_index_entry_step (node0x7fff3029c338, thr0x7fff3029c6f8)at /storage/innobase/row/row0ins.cc:3425
#5 0x000055555a4ca616 in row_ins (node0x7fff3029c338, thr0x7fff3029c6f8)at /storage/innobase/row/row0ins.cc:3544
#6 0x000055555a4caa92 in row_ins_step (thr0x7fff3029c6f8)at /storage/innobase/row/row0ins.cc:3668
#7 0x000055555a4ea804 in row_insert_for_mysql_using_ins_graph (mysql_rec0x7fff302892c8 \376\005, prebuilt0x7fff3029b830) at /storage/innobase/row/row0mysql.cc:1581
#8 0x000055555a4eae9a in row_insert_for_mysql (mysql_rec0x7fff302892c8 \376\005, prebuilt0x7fff3029b830) at /storage/innobase/row/row0mysql.cc:1711
#9 0x000055555a2a9ad9 in ha_innobase::write_row (this0x7fff30287bf8, record0x7fff302892c8 \376\005)at /storage/innobase/handler/ha_innodb.cc:8629
#10 0x0000555558d4ace2 in handler::ha_write_row (this0x7fff30287bf8, buf0x7fff302892c8 \376\005)at /sql/handler.cc:7831
#11 0x00005555590a14a7 in write_record (thd0x7fff30001040, table0x7fff30287270, info0x7fffe83d64f0, update0x7fffe83d6570) at /sql/sql_insert.cc:2148
#12 0x000055555909cb7e in Sql_cmd_insert_values::execute_inner (this0x7fff302becc8, thd0x7fff30001040)at /sql/sql_insert.cc:633
#13 0x00005555589ff8fc in Sql_cmd_dml::execute (this0x7fff302becc8, thd0x7fff30001040)at /sql/sql_select.cc:612
#14 0x000055555897bd6e in mysql_execute_command (thd0x7fff30001040, first_leveltrue)at /sql/sql_parse.cc:3420
#15 0x00005555589810b9 in dispatch_sql_command (thd0x7fff30001040, parser_state0x7fffe83d7b90)at /sql/sql_parse.cc:4988
#16 0x0000555558977226 in dispatch_command (thd0x7fff30001040, com_data0x7fffe83d8b80, commandCOM_QUERY) at /sql/sql_parse.cc:1836
#17 0x00005555589756df in do_command (thd0x7fff30001040)at /sql/sql_parse.cc:1320
#18 0x0000555558b6ee3d in handle_connection (arg0x55556006bbe0)at /sql/conn_handler/connection_handler_per_thread.cc:301
#19 0x000055555aa337b6 in pfs_spawn_thread (arg0x55555fee7ae0)at /storage/perfschema/pfs.cc:2900
--Type RET for more, q to quit, c to continue without paging--
#20 0x00007ffff7f95609 in start_thread (argoptimized 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。