MySQL核心InnoDB儲存引擎(卷1)筆記
MySQL核心InnoDB儲存引擎(卷1)
目錄
概覽
基本資料結構和演算法
同步機制
- rw-lock/latch
- s-/x-:x-可遞迴,s-不可?;以spin獲得,一段時間後進入wait array(訊號量?)
- p38 若sync_primary_wait_array中1000個cell都已分配,則ut_error觸發crash
- 當持有latch的執行緒釋放latch後,呼叫sync_array_signal_object喚醒等待執行緒
重做日誌
- p42 redo log原來保證事務的永續性(D),undo log用於回滾和MVCC
- innodb_flush_log_at_trx_commit=0/1/2
- redo log VS. bin log
- 前者記錄的是頁的物理邏輯操作日誌
- 設計思想:物理日誌記錄頁內的修改(old-new value),邏輯日誌記錄對錶的操作(insert/delete)
- LSN(表示事務寫入redo log的位元組量?)
- 對‘檢查點’,表示重新整理到磁碟的位置?——不管怎麼說,LSN有一種‘隨時間單調變化’的性質
- 檢查點:將緩衝池中的頁重新整理到磁碟
- sharp
- fuzzy*
- redo日誌的大小是固定的(3GB)->歸檔日誌
- ib_logfile<N>
- redo日誌塊(512B-12-8)
- 和磁碟扇區大小一樣,保證原子性,不需要double write?
- 重做日誌組*
- 組提交:fsync -> log_flush_up_to 會對最後一個日誌塊進行復制
- 恢復:recovery_from_checkpoint_start
- 表空間第一個頁頭部的FIL_PAGE_FILE_FLUSH_LSN記錄了資料庫關閉時最後重新整理頁的LSN
- recv_parse_or_apply_log_rec_body
- recv_add_to_hash_table
- recv_recover_page
- recv_read_in_area 判斷頁所在相鄰的32個頁?
mini-transaction(mtr)
- FIX rules:修改頁之前需要持有該頁的latch
- WAL
- 每個頁需要有一個LSN?LSN溢位怎麼辦?
- Force-Log-at-Commit
- mtr_t mtr; mtr_start(&mtr); ... mtr_commit(&mtr);
- 提交時若mtr->modified==TRUE,先修改緩衝池中的頁*1,然後釋放log_sys->mutex(這是一個熱點)
- *1 log_reserve_and_write_fast/log_write_slow 快速/慢速2個路徑
- 更新多行記錄時,MLOG_MULTI_REC_END
- 提交時若mtr->modified==TRUE,先修改緩衝池中的頁*1,然後釋放log_sys->mutex(這是一個熱點)
儲存管理
- 頁:(space_id, offset) 16KB
- 1 extent = 64 連續的page
- space header
- 段(segment)
- 每張使用者表至少2個段:聚集索引(B+樹)的葉子節點和非葉子節點段
- 一個段最多可以管理32個獨立的頁,和若干區
- 表空間
- 資料結構:fil_system/space/node_struct
- 4個非同步I/O執行緒:非同步讀、非同步寫、插入快取、重做日誌
記錄
- 物理記錄
- p102 使用者記錄的heap no總是從2開始
- 偽記錄:Infimum/Supremum(感覺將像是雙連結串列的first/last)
- p103 VARCHAR型別的NULL不佔用磁碟空間,而CHAR NULL用0x00填充
- 大記錄:BLOB/TEXT(溢位頁,extern屬性)
- p102 使用者記錄的heap no總是從2開始
- 邏輯記錄
- dtuple_struct,對大記錄是big_rec_struct
- B+樹索引只定位頁,頁內記錄需要二分掃描
- mtype/prtype
- 行記錄版本(MVCC只是列?):通過隱藏的事務ID列
- read_view_struct:
- low/up_limit_id
- trx_ids, n_trx_ids
- creator
- p114 函式read_view_sees_trx_id用來判斷當前事務是否可以讀記錄的當前版本,不是,則row_sel_build_prev_vers_for_mysql
- read_view_struct:
索引頁
- Page Header
- 頁內記錄根據主鍵是邏輯順序,不是物理順序
- Page Directory(定位記錄在頁內的位置)
- slot?offset的主鍵逆序記錄
- Page Cursor*
鎖
- p136 理論上,隔離級別越低,事務請求的鎖越少或保持鎖的時間越短
- 幻讀:謂詞鎖 --> key-range locking --> next/previous-key locking
- p138 意向鎖:意味著事務希望在更細粒度上加鎖
- InnoDB是行級鎖,不會阻止全表掃描以外的請求
- lock_rec_struct = { space, page_no, n_bits }
- 所有鎖物件通過kernel_mutex進行保護(又一個熱點!)
- 優化:細粒度拆分?
- 所有鎖物件通過kernel_mutex進行保護(又一個熱點!)
- p144 LOCK_GAP(代表範圍鎖不包含端點)
- 顯式鎖和隱式鎖**(略)
- 行鎖的維護*(重點,略)
- 插入
- 更新
- PURGE
- 一致性的鎖定讀
- 頁的分裂
- 頁的合併
- 自增鎖(atomic?)
- 死鎖*
B+樹索引
- 聚集 / 輔助
- 分裂操作:btr_page_split_and_insert
- 合併:btr_compress
- 查詢:btr_cur_search_to_nth_level
- p203 對唯一約束的鍵值,需要使用模式PAGE_CUR_GE,而不是LE
- latch_mode
- cursor
- DML操作
- 樂觀插入:btr_cur_optimistic_insert
- 非主鍵更新(主要是列的大小會不會發生變化)
- btr_cur_optimistic_update --> btr_cur_pessimistic_update(例略)
- 主鍵更新
- 刪除
- 持久遊標 btr_pcur_struct
- 自適應雜湊索引*
Insert Buffer
- 將多次插入合併為一次操作(提高了非唯一約束輔助索引的插入效能)
- p237 實現最為困難的在於對死鎖的處理
- 頁邏輯層次劃分:非IB頁、IB非bitmap頁、bitmap頁
- p241 非同步I/O執行緒可能引起死鎖問題 --> rw_lock_x_lock_move_ownership
緩衝池
- LRU、Free和Flush連結串列
- 預讀
- p258 隨機預讀
- 要滿足32個頁中9個已經訪問過且都是活躍的才可能觸發
- 線性預讀*
- 邏輯預讀
- p258 隨機預讀
- 頁的重新整理
- 部分寫問題(?) --> double write(存在於記憶體的表空間,大小為2MB,這意味著最多128頁/次重新整理)
事務處理
- 分類:扁平、帶儲存點的扁平、鏈、巢狀、分散式
- 事務系統段*
- doublewrite段*
- undo日誌儲存
- 一致性的非鎖定讀
- p282 讀取快照不需要加鎖
- undo日誌實現:回滾段 + undo段
- trx_undo_struct
- 一致性的非鎖定讀
- undo記錄
- purge*
- rollback
- 7B roll_ptr隱藏列 {rseg_id(1), page_no(4), offset(2)}
- 3個回滾型別:TRX_SIG_{TOTAL_ROLLBACK, ROLLBACK_TO_SAVEPT, ERROR_OCCURRED}
- commit
資料字典
服務管理
相關文章
- MySQL InnoDB儲存引擎MySql儲存引擎
- MySQL InnoDB 儲存引擎探祕MySql儲存引擎
- MySQL提升筆記(4)InnoDB儲存結構MySql筆記
- MySQL儲存引擎--MyISAM與InnoDB區別MySql儲存引擎
- 《MySQL 效能優化》之 InnoDB 儲存引擎MySql優化儲存引擎
- [Mysql技術內幕]Innodb儲存引擎MySql儲存引擎
- MySQL InnoDB儲存引擎體系結構MySql儲存引擎
- MySQL原理 - InnoDB引擎 - 行記錄儲存 - Off-page 列MySql
- MySQL儲存引擎:MyISAM和InnoDB的區別MySql儲存引擎
- InnoDB儲存引擎簡介儲存引擎
- 【Mysql技術內幕筆記--1】--Mysql體系結構和儲存引擎MySql筆記儲存引擎
- 十八、Mysql儲存引擎並不只有MyISAM、InnoDB——精髓MySql儲存引擎
- MySQL高階10-InnoDB引擎儲存架構MySql架構
- 每日分享-MySQL-2019-08-05-【InnoDB 儲存引擎】MySql儲存引擎
- 總結MySQL儲存引擎MyISAM與InnoDB區別MySql儲存引擎
- MySQL的varchar儲存原理:InnoDB記錄儲存結構MySql
- 14.1 InnoDB 儲存引擎介紹儲存引擎
- 談談MySQL InnoDB儲存引擎事務的ACID特性MySql儲存引擎
- MySQL三種InnoDB、MyISAM和MEMORY儲存引擎對比MySql儲存引擎
- mysql儲存引擎InnoDB詳解,從底層看清InnoDB資料結構MySql儲存引擎資料結構
- MySQL 儲存引擎MySql儲存引擎
- MySQL儲存引擎MySql儲存引擎
- MySQL兩種儲存引擎: MyISAM和InnoDB 簡單總結MySql儲存引擎
- MySQL儲存引擎簡介及MyISAM和InnoDB的區別MySql儲存引擎
- MySQL中InnoDB儲存引擎的實現和執行原理MySql儲存引擎
- InnoDB儲存引擎MVCC實現原理儲存引擎MVC
- 第二章 InnoDB儲存引擎儲存引擎
- 你真的瞭解Innodb儲存引擎?儲存引擎
- MySQLInnoDB儲存引擎(一):精談innodb的儲存結構MySql儲存引擎
- 《MySQL 基礎篇》十二:InnoDB 儲存引擎的資料結構MySql儲存引擎資料結構
- MySQL資料庫InnoDB儲存引擎中的鎖機制GVMySql資料庫儲存引擎
- InnoDB儲存引擎鎖機制(一、案例)儲存引擎
- innodb儲存引擎鎖的實現(一)儲存引擎
- MySQL系列-儲存引擎MySql儲存引擎
- 隨筆:MySQL中'' ' ' NULL在Innodb儲存的區別MySqlNull
- 服務端指南 資料儲存篇 | MySQL(02) 儲存引擎的 InnoDB 與 MyISAM 之爭服務端MySql儲存引擎
- MySQL InnoDB儲存引擎更新Cardinality統計資訊的策略介紹MySql儲存引擎
- 深入解讀MySQL InnoDB儲存引擎Update語句執行過程MySql儲存引擎
- MyISAM與innoDB儲存引擎有何差別儲存引擎