久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Innodb中insert第一次進行樂觀插入邏輯分析

186次閱讀
沒有評論

共計 2542 個字符,預計需要花費 7 分鐘才能閱讀完成。

這篇文章主要講解了“Innodb 中 insert 第一次進行樂觀插入邏輯分析”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著丸趣 TV 小編的思路慢慢深入,一起來研究和學習“Innodb 中 insert 第一次進行樂觀插入邏輯分析”吧!

實際在這之前記錄是每行每行的插入,而且是每行每個索引的插入,這里僅僅講述的是某行關于某個二級索引的樂觀插入流程,所謂樂觀就是不會引起索引樹的結構更改,換而言之當前塊有足夠的空間進行插入。

本文僅僅記錄樂觀插入的流程,和函數的入口,實際上很多我們關心的東西在哪里比如,這里沒有考慮壓縮頁:

重用空間只會檢查 del 鏈表的第一個成員,因此塊中可能存在碎片

是否觸發悲觀插入是通過計算整個塊的剩余空間和插入記錄的長度比較得出的結果,剩余空間包含了碎片空間

對于插入印象鎖需要根據下一條記錄是否上鎖來判斷是否需要加并且等待

可能會觸發鎖繼承

唯一檢查會可能觸發 LOCK_S 也是這里進入的

插入之前要定位數據

undo 在 redo 生成之前生成

邏輯入口如下:

- row_ins_sec_index_entry_low  第一次進行樂觀插入  mode=BTR_MODIFY_LEAF
 -   是否是唯一鍵   是  row_ins_scan_sec_index_for_duplicate  進行唯一性檢查
 -   進行唯一性檢測結果處理
 -   進行數據查找  btr_cur_search_to_nth_level
 - page_cur_search_with_match_bytes
 -   如果只是檢查重復值跳過下面邏輯  if (dup_chk_only) 
 -   進行樂觀插入,假設不修改 B + 樹結構  btr_cur_optimistic_insert, 主要通過 BTR_MODIFY_LEAF 標示識別,此處不考慮壓縮頁
 - 計算轉換邏輯記錄 (元組) 為物理記錄后的長度  rec_get_converted_size
 - rec_get_converted_size_comp
 - 是否需要外部存儲 page_zip_rec_needs_ext
 - 獲取塊的空閑空間大小  page_get_max_insert_size_after_reorganize  備注(1
 - 進行是否需要悲觀插入的邏輯判斷, 主要還是空間不夠的情況   備注(2,如果需要悲觀插入則這里返回了
 - 如果是主鍵還需要預留部分空間   備注(3, 如果沒有預留空間也會進入悲觀插入流程
 - 判斷是否需要加鎖和開 undo btr_cur_ins_lock_and_undo,此函數還會返回是否需要做鎖繼承的處理為輸出參數 inherit
 - 檢查是否需要加鎖 lock_rec_insert_check_and_lock  插入印象鎖就在這里
 - 記錄 undo trx_undo_report_row_operation
 - 更改 row undo ptr 指針 row_upd_index_entry_sys_field
 - 做實際插入操作  page_cur_tuple_insert
 - 邏輯記錄轉換為物理記錄  rec_convert_dtuple_to_rec
 - 獲取每個字段的偏移量  rec_get_offsets
 - 進行實際插入  page_cur_insert_rec_low
 - 獲取記錄的實際大小
 - 尋找合適的位置進行插入,本步驟會找到合適的位置返回給 insert_buf
 - 獲取 free 鏈表的頭部記錄,注意只會檢查第一個記錄,不會做遍歷,因此塊中碎片是極有可能出現的
  只是 innodb 可以重組
 - 如果合適則使用
 - 不合適則返回
 - 進行記錄創建拷貝  memcpy 方式復制數據到 insert_buf 指向的位置, 完成這一步記錄加入到了塊中   下面需要維護各種塊信息  
 - 將記錄加入到記錄鏈表
 - 更新行的 N_OWNER 為 0,以及設置 heap_no
 - 設置塊的一些最后修改屬性如 PAGE_DIRECTION、PAGE_N_DIRECTION、PAGE_LAST_INSERT
 - 更新 slot 的信息, 可能涉及更改 owner 記錄信息和 owner 記錄的 N_OWNER 信息
 - 寫 redo 信息  page_cur_insert_rec_write_log
 - 返回插入記錄的 offset
 - 進行 AHI 維護  btr_search_update_hash_on_insert/btr_search_update_hash_node_on_insert
 - 進行可能的鎖的分裂  lock_update_insert  此處主要的判斷是前面的輸出參數 inherit
 - 進行 CHANGE BUFFER 維護  ibuf_update_free_bits_if_full
 -   如果成功修改最大事物 ID PAGE_MAX_TRX_ID page_update_max_trx_id
 -   返回結果

備注 1) 計算方式為
空頁的容量 = 頁大小 (比如 16K) – 頁頭大小(120) – 頁尾大小(8) – 初始化 2 個槽大小(4=2*2)
實際的數據占用空間 = 已經分配數據空間的最大數據偏移量 – 頁頭大小(120) – 已經刪除且 purge 的空間包含碎片空間 + 槽大小

然后用
空頁的容量 – 實際的數據占用空間 = 實際可用空間

因為頁中難免會出現一些碎片,但是 innodb 的 page 擁有重新組織的能力,能夠釋放這部分空間。其重組函數為 btr_page_reorganize_low

備注 2) 邏輯包含
如果包含碎片空間那么
— 如果可用空間不足或者可用空間已經少于了重組塊的設置 BTR_CUR_PAGE_REORGANIZE_LIMIT(UNIV_PAGE_SIZE / 32)
— 記錄數量大于 1
— 可用空間小于了插入記錄的大小
否則
— 可用空間小于了插入記錄的大小

備注 3) 邏輯包含
– 葉子結點
— 主鍵
— 記錄大于兩行
— 剩余的空間 – 行的空間 page_size/16
— 分裂建議建議分裂

感謝各位的閱讀,以上就是“Innodb 中 insert 第一次進行樂觀插入邏輯分析”的內容了,經過本文的學習后,相信大家對 Innodb 中 insert 第一次進行樂觀插入邏輯分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是丸趣 TV,丸趣 TV 小編將為大家推送更多相關知識點的文章,歡迎關注!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-24發表,共計2542字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 香格里拉县| 石城县| 安泽县| 阜新市| 咸宁市| 富源县| 上思县| 浮梁县| 宁津县| 黄冈市| 密云县| 韶关市| 香港 | 昭平县| 葵青区| 盐亭县| 疏勒县| 金湖县| 江永县| 贵阳市| 双桥区| 噶尔县| 耿马| 民和| 武川县| 广元市| 乳山市| 天长市| 弋阳县| 嘉鱼县| 巴林右旗| 辽源市| 小金县| 宣恩县| 家居| 印江| 清丰县| 蒙城县| 万荣县| 松江区| 遂川县|