日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

發(fā)布時間:2023/12/20 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 8.0 一条insert语句的具体执行流程分析(三) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

代碼版本:mysql 8.0.22

編程語言:c++ && c++11 && c++14 && c++17

上一篇文章:mysql 8.0 一條insert語句的具體執(zhí)行流程分析(二)_一縷陽光的博客-CSDN博客

主要介紹了存儲引擎部分,這個章節(jié)主要介紹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 : 掃描給定索引項處的唯一非聚集索引,以確定該項的鍵值是否發(fā)生唯一性沖突。對可能重復的記錄設置共享鎖

最后,所有斷點都被執(zhí)行之后,使用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语句的具体执行流程分析(三)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。