mysql 8.0 一条insert语句的具体执行流程分析(二)
繼續(xù)上一篇文章:mysql 8.0 一條insert語句的具體執(zhí)行流程分析(一)_一縷陽光的博客-CSDN博客
由于最近換工作一直在試用期內(nèi),在拼命的學習、總結(jié)中,因此沒有時間寫文章,今天轉(zhuǎn)正了騰出來時間繼續(xù)寫下一篇文章。mysql 8.0 一條insert語句的具體執(zhí)行流程分析寫完了write_record部分,下面將會運行到engine層,主要存儲引擎的接口
代碼版本:mysql 8.0.22
編程語言:c++ && c++11 && c++14 && c++17
這里使用MySQL InnoDB存儲引擎,存儲引擎接口涉及多個文件,由于內(nèi)容過多,分下面幾個部分進行分開描述,代碼是按下面的章節(jié)順序執(zhí)行的。
| > handler::ha_write_row | | > ha_innobase::write_row | | | > row_insert_for_mysql | | | | > row_insert_for_mysql_using_ins_graph | | | | | > trx_start_if_not_started_xa> trx_start_if_not_started_xa_low> trx_start_low | | | | | > row_mysql_convert_row_to_innobase | | | | | > row_ins_step(1)、ha_write_row : 用于插入一條記錄
int handler::ha_write_row(uchar *buf) {......// 主要是調(diào)用這個ha_innobase::write_rowMYSQL_TABLE_IO_WAIT(PSI_TABLE_WRITE_ROW, MAX_KEY, error,{ error = write_row(buf); })return 0; }(2)、write_row : 在InnoDB database中存儲一行數(shù)據(jù),針對這張表對應的handle
int ha_innobase::write_row(uchar *record) {......update_auto_increment(); // 更新自增建.../* Execute insert graph that will result in actual insert. */error = row_insert_for_mysql((byte *)record, m_prebuilt);}其中里面會更新自增鍵,如果建表語句中有自增列。
(3)、row_insert_for_mysql : 執(zhí)行insert操作
這個函數(shù)比較簡單,直接透傳到下面的函數(shù)中了
/** Does an insert for MySQL. @param[in] mysql_rec row in the MySQL format @param[in,out] prebuilt prebuilt struct in MySQL handle @return error code or DB_SUCCESS*/ dberr_t row_insert_for_mysql(const byte *mysql_rec, row_prebuilt_t *prebuilt) {/* For intrinsic tables there a lot of restrictions that can berelaxed including locking of table, transaction handling, etc.Use direct cursor interface for inserting to intrinsic tables. */if (prebuilt->table->is_intrinsic()) {return (row_insert_for_mysql_using_cursor(mysql_rec, prebuilt));} else {return (row_insert_for_mysql_using_ins_graph(mysql_rec, prebuilt));} }(4)、row_insert_for_mysql_using_ins_graph : 使用graph結(jié)構(gòu)存儲insert的信息
static dberr_t row_insert_for_mysql_using_ins_graph(const byte *mysql_rec,row_prebuilt_t *prebuilt) { ......row_mysql_convert_row_to_innobase(node->row, prebuilt, mysql_rec, &blob_heap);run_again:thr->run_node = node;thr->prev_node = node;row_ins_step(thr); // 向一個table中插入一行... }(5)、trx_start_if_not_started_xa : 這部分是開啟XA事務
(6)、row_mysql_convert_row_to_innobase : 將一行數(shù)據(jù)從MySQL格式轉(zhuǎn)換為innodb格式
(7)、row_ins_step : 向一個table中插入一行
| > row_ins_step | | > row_ins | | | > row_ins_index_entry_step | | | | > row_ins_index_entry> row_ins_clust_index_entry> row_ins_sec_index_multi_value_entry > row_ins_sec_index_entry(8)、row_ins_step : 向表中插入一行,會調(diào)用下面的row_ins
/** Inserts a row to a table. This is a high-level function used in SQLexecution graphs.@return query thread to run next or NULL */ que_thr_t *row_ins_step(que_thr_t *thr) /*!< in: query thread */ {...err = row_ins(node, thr);...return (thr); }(9)、row_ins : 向表中插入一行
(10)、row_ins_index_entry_step : 向表中插入index
(11)、row_ins_index_entry :
??? (1)、row_ins_clust_index_entry : 聚集索引執(zhí)行這個分支
??? (2)、row_ins_sec_index_multi_value_entry : 使用二級索引多個value值時,執(zhí)行這個分支
??? (3)、row_ins_sec_index_entry : 二級索引執(zhí)行這個分支
本篇文章先寫到這里,下一篇文章主要講述使用二級索引時的執(zhí)行流程。
題外話:跟公司簽了3年合同,試用期6個月,是不是試用期太長了,國家規(guī)定的也是6個月嗎?如果比較清楚這個事,請告知我(zgaoq@163.com),謝謝
總結(jié)
以上是生活随笔為你收集整理的mysql 8.0 一条insert语句的具体执行流程分析(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在艰苦年代,买不起万用表,怎么测量电路电
- 下一篇: java遍历map集合_Java中遍历M