您好,登錄后才能下訂單哦!
本篇內容主要講解“insert進行第一次樂觀插入邏輯分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“insert進行第一次樂觀插入邏輯分析”吧!
可能會觸發鎖繼承
唯一檢查會可能觸發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
-- 分裂建議建議分裂
到此,相信大家對“insert進行第一次樂觀插入邏輯分析”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。