MySQL内核:InnoDB存储引擎 卷1
MySQL內核:InnoDB存儲引擎卷1(MySQL領域Oracle ACE專家力作,眾多MySQL Oracle ACE力捧,深入MySQL數據庫內核源碼分析,InnoDB內核開發與優化必備寶典)
姜承堯 蔣鴻翔 饒瓏輝 溫正湖 著??
ISBN 978-7-121-22908-4
2014年5月出版
定價:69.00元
360頁
16開
編輯推薦
預售前100位讀者送MySQL 5.6 InnoDB存儲引擎的架構圖
l? 《高性能MySQL》配套深度閱讀數據庫內核解析篇
l? 網易資深數據庫專家十余年深耕之作
l? 深入理解InnoDB引擎是如何設計和工作的
l? 讓正在通往或已經在數據庫內核開發道路的人員少走彎路
內容提要
《MySQL內核:InnoDB存儲引擎 卷1》由資深MySQL專家,機工暢銷圖書作者親自執筆,在以往出版的兩本InnoDB介紹性圖書的基礎之上,更深入地介紹InnoDB存儲引擎的內核,例如latch、B+樹索引、事務、鎖等,從源代碼的角度深度解析了InnoDB的體系結構、實現原理、工作機制,并給出了大量最佳實踐,希望通過《MySQL內核:InnoDB存儲引擎 卷1》幫助用戶真正了解一個數據庫存儲引擎的開發。
《MySQL內核:InnoDB存儲引擎 卷1》可以成為帶領讀者進入數據庫存儲引擎的內核開發,幫助那些從事MySQL數據庫的相關行業從業人員。同時,《MySQL內核:InnoDB存儲引擎 卷1》也適合對于研究生階段有志于數據庫內核開發的同學。
目錄
第1章 概覽
1.1 InnoDB 存儲引擎歷史
1.2 源碼版本
1.3 源碼風格
1.3.1 源碼結構
1.3.2 代碼風格
1.4 代碼編譯
1.5 閱讀源碼次序
1.6 思考題
1.7 繼續閱讀
第2章 基本數據結構與算法
2.1 相關文件
2.2 內存管理系統
2.2.1 內存管理
2.2.2 通用內存池
2.3 哈希表
2.3.1 哈希算法
2.3.2 數據結構
2.4 雙鏈表
2.4.1 內存雙鏈表
2.4.2 磁盤雙鏈表
2.5 其他數據結構和算法
2.5.1 動態數組
2.5.2 排序
2.6 小結
2.7 思考題
2.8 繼續閱讀
第3章 同步機制
3.1 相關文件
3.2 基礎知識
3.2.1 memory model
3.2.2 mutual exclution
3.2.3 Atomic Read-Modify-Write Operation
3.2.4 spin lock
3.2.5 死鎖
3.3 InnoDB 同步機制
3.3.1 mutex
3.3.2 rw-lock
3.3.3 wait array
3.3.4 死鎖檢測
3.4 小結
3.5 思考題
3.6 繼續閱讀
第4章 重做日志
4.1 相關文件
4.2 相關概念
4.2.1 簡介
4.2.2 物理邏輯日志
4.2.3 LSN
4.2.4 檢查點
4.2.5 歸檔日志
4.2.6 恢復
4.3 物理存儲結構
4.3.1 重做日志物理架構
4.3.2 重做日志塊
4.3.3 重做日志組與文件
4.4 相關數據結構
4.4.1 log_group_struct
4.4.2 log_struct
4.5 組提交
4.6 恢復
4.6.1 數據結構
4.6.2 重做日志恢復
4.7 總結
4.8 思考題
4.9 繼續閱讀
第5章 mini-transaction
5.1 相關文件
5.2 mini-transaction 介紹
5.2.1 基本概念
5.2.2 The FIX Rules
5.2.3 Write-Ahead Log(WAL)
5.2.4 Force-log-at-commit
5.3 具體實現
5.3.1 數據結構
5.3.2 物理邏輯日志的實現
5.3.3 mini-transaction 的使用
5.4 示例
5.5 小結
5.6 思考題
5.7 繼續閱讀
第6章 存儲管理
6.1 相關文件
6.2 物理存儲
6.2.1 頁
6.2.2 區
6.2.3 段
6.2.4 表空間
6.3 數據結構
6.3.1 概述
6.3.2 fil_system_struct
6.3.3 fil_space_struct
6.3.4 fil_node_struct
6.4 異步 I/O
6.4.1 異步 I/O 數據結構
6.4.2 異步 I/O 線程
6.5 總結
6.6 思考題
6.7 繼續閱讀
第 7 章 記錄
7.1 相關文件
7.2 概述
7.3 物理記錄
7.3.1 物理記錄格式
7.3.2 大記錄格式
7.3.3 偽記錄
7.4 邏輯記錄
7.5 記錄之間的比較
7.6 行記錄版本
7.7 小結
7.8 思考題
7.9 繼續閱讀
第8章 索引頁
8.1 相關文件
8.2 頁
8.3 存儲結構
8.3.1 Page Header
8.3.2 Page Directory
8.3.3 示例
8.4 Page Cursor
8.4.1 定位記錄
8.4.2 插入記錄
8.4.3 刪除記錄
8.4.4 并發控制
8.5 小結
8.6 思考題
8.7 繼續閱讀
第9章 鎖
9.1 相關文件
9.2 鎖與事務
9.2.1 隔離性
9.2.2 事務的隔離級別
9.2.3 幻讀
9.3 InnoDB 存儲引擎中鎖的類型與算法
9.4 鎖的內部實現
9.4.1 數據結構
9.4.2 鎖的并發控制
9.4.3 鎖的類型與模式
9.4.4 鎖的兼容性
9.5 顯式鎖和隱式鎖
9.5.1 顯式鎖與隱式鎖的區別
9.5.2 聚集索引記錄的隱式鎖
9.5.3 輔助索引記錄的隱式鎖
9.6 加鎖操作
9.6.1 加鎖流程
9.6.2 加鎖過程
9.7 行鎖的維護
9.7.1 插入
9.7.2 更新
9.7.3 PURGE
9.7.4 一致性的鎖定讀
9.7.5 頁的分裂
9.7.6 頁的合并
9.8 自增鎖
9.9 死鎖
9.9.1 死鎖的概念
9.9.2 死鎖概率
9.9.3 死鎖的示例
9.10 小結
9.11 思考題
9.12 繼續閱讀
第10章 B+樹索引
10.1 B+ 樹
10.1.1 概述
10.1.2 插入
10.1.3 刪除
10.2 B+ 樹索引
10.2.1 索引的特點
10.2.2 聚集索引
10.2.3 輔助索引
10.2.4 填充因子
10.3 InnoDB 存儲引擎 B+ 樹索引實現
10.3.2 相關 latch
10.3.3 整理
10.3.4 分裂
10.3.5 合并
10.4 查找
10.4.1 mode
10.4.2 latch_mode
10.4.3 cursor
10.5 DML 操作
10.5.1 插入
10.5.2 非主鍵更新
10.5.3 主鍵更新
10.5.4 刪除
10.6 持久游標
10.7 自適應哈希索引
10.7.1 實現原理
10.7.2 創建哈希索引
10.7.3 哈希索引的維護
10.7.4 自適應哈希索引的優缺點
10.8 小結
10.9 思考題
10.10 繼續閱讀
第11章 Insert Buffer
11.1 相關文件
11.2 基本概念
11.3 架構實現
11.3.1 存儲結構
11.3.2 邏輯控制
11.3.3 示例
11.4 相關數據結構
11.5 死鎖
11.5.1 latch 順序
11.5.2 并發控制
11.5.3 異步 I/O 線程
11.6 維護
11.6.1 記錄合并
11.6.2 空間收縮
11.7 小結
11.8 思考題
11.9 繼續閱讀
第12章 緩沖池
12.1 相關文件
12.2 概述
12.2.1 緩沖池
12.2.2 LRU、Free 和 Flush 鏈表
12.2.3 基本數據結構
12.3 緩沖池的管理
12.3.1 LRU 算法
12.3.2 LRU 鏈表維護
12.3.3 頁的分配
12.4 頁的讀取
12.4.1 物理讀取
12.4.2 隨機預讀
12.4.3 線性預讀
12.4.4 邏輯讀取
12.5 頁的刷新
12.5.1 檢查點
12.5.2 部分寫的問題
12.5.3 刷新的實現
12.6 小結
12.7 思考題
12.8 繼續閱讀
第13章 事務處理
13.1 相關文件
13.2 事務
13.2.1 概述
13.2.2 分類
13.2.1 隔離級別
13.3 事務系統結構
13.3.1 事務系統段
13.3.2 數據結構
13.4 DOUBLEWRITE 段
13.5 UNDO 日志存儲
13.5.1 簡介
13.5.2 實現結構
13.5.3 回滾段
13.5.4 UNDO 段
13.6 UNDO 記錄
13.6.1 存儲結構
13.6.2 INSERT UNDO LOG RECORD
13.6.3 UPDATE UNDO LOG RECORD
13.7 PURGE
13.7.1 清理操作
13.7.2 實現原理
13.8 ROLLBACK
13.8.1 回滾指針
13.8.2 回滾操作
13.9 COMMIT
13.10 kernel_mutex 與并發控制
13.11 小結
13.12 思考題
13.13 繼續閱讀
第14章 數據字典
14.1 相關文件
14.2 數據字典概述
14.3 主要數據對象
14.3.1 數據字典系統
14.3.2 表定義
14.3.3 索引定義
14.3.4 外鍵約束定義
14.3.5 其他數據對象定義
14.4 InnoDB 系統表對象
14.4.1 SYS_TABLES
14.4.2 SYS_COLUMNS
14.4.3 SYS_INDEXES
14.4.4 SYS_FIELDS
14.4.5 其他表對象
14.5 數據字典創建
14.5.1 數據字典段
14.5.2 數據字典物理結構
14.5.3 數據字典初始化
14.5.4 數據字典緩存組織
14.6 數據字典對象加載
14.6.1 用戶表加載
14.6.2 用戶索引和外鍵約束加載
14.7 小結
14.8 思考題
14.9 繼續閱讀
第15章 服務管理
15.1 相關文件
15.2 初始化 InnoDB 存儲引擎
15.2.1 相關重要參數
15.2.2 服務管理相關數據結構
15.2.3 文件創建和加載
15.2.4 啟動后臺線程
15.3 關閉 InnoDB 存儲引擎
15.3.1 數據持久化
15.3.2 資源釋放
15.4 master 線程
15.4.1 主要功能
15.4.2 數據刷盤策略
15.5 鎖超時監控線程
15.6 思考題
15.7 繼續閱讀
作者簡介
姜承堯(DavidJiang),MySQL領域的Oracle ACE,資深MySQL數據庫專家,擅長于數據庫的故障診斷、性能調優、容災處理、高可用和高擴展研究,同時一直致力于MySQL數據庫底層實現原理的研究和探索。此外,對高性能數據庫和數據倉庫也有深刻而獨到的理解。曾為MySQL編寫了許多開源工具和性能擴展補丁,如廣受好評的InnoDB引擎二級緩存項目。現任網易杭州研究院技術經理一職,負責MySQL數據庫的內核開發,參與設計與開發MySQL數據庫在網易云環境中的應用。曾擔任久游網數據庫工程部經理,曾領導并參與了多個大型核心數據庫的設計、實施、管理和維護,實戰經驗非常豐富?;钴S于開源數據庫以及開源軟件領域,是著名開源社區ChinaUnixMySQL版塊的版主,熱衷于與網友分享自己的心得和體會,深受社區歡迎
前言
為什么要寫這本書
過去這些年,我一直在和各種不同的數據庫打交道,見證了 MySQL 從一個小型的關系型數據庫發展成為各大互聯網企業的核心數據庫系統的過程。期間我參與了一些大大小小的項目開發工作,成功地幫助開發人員構建了一些可靠的、健壯的應用程序。在這個過程中積累了一些經驗,正是這些不斷累積的經驗賦予了我靈感,于是有了本書。這本書實際上反映了這些年來我做了哪些事情,匯集了很多同行每天可能都會遇到的一些問題,并給出解決方案。
本書是 MySQL 內核系列的第一本書,與之前出版的 MySQL 技術內幕不同的是,該系列的書將更靠近數據庫內核層面,揭示 MySQL 數據庫內核是如何運行的。MySQL 內核系列的第一本書將從 InnoDB 存儲引擎的內核來展開。
毫無疑問,InnoDB 存儲引擎已經成為 MySQL 數據庫的“標準配置”。Facebook、Twitter、Yahoo、百度、淘寶、騰訊、網易這些互聯網公司都將 InnoDB 作為后臺的存儲引擎。在時間的長河以及線上高并發驗證下,其已經被證明是高性能、高可擴展性的引擎。身處數據庫這個圈子,可以明顯地感覺到從 2010 年開始,各大互聯網公司已經不再滿足于僅僅使用 InnoDB 存儲引擎,他們開始越來越接觸到引擎的內核層面,對引擎進行內核級別的優化以及根據公司的業務需求進行二次開發。即使是 DBA 本身也開始慢慢地不滿足現狀開始研究起 InnoDB 存儲引擎的內核,似乎一夜之間不了解點內核實現都不好意思和別人說
你是搞 MySQL 數據庫的。當然,我們需要感謝 MySQL 數據庫,感謝 MySQL 數據庫的創始人和 InnoDB 存儲引擎的創始人。正是他們開源了這些代碼,使得我們這些后人可以站在巨人的肩膀上繼續學習與進步。在這方面,MySQL/InnoDB 比其他數據庫都要偉大,更值得我們尊敬。不可否認的是,國內對于數據庫內核的開發學習資料與課程都非常有限。本科階段幾乎沒有相關課程,僅特定數據庫研究方向的研究生才會去關注這些技術,并且這些人才在國內非常稀少。很多想要踏進數據庫內核領域的人在最初都會感到迷茫和無助。另外,有些人憑著自己的聰明與天賦看似掌握了內核的實現,但是從他們的博客描述來看,其離真正的理解還是有一些距離的,或者說他們僅剛入門。所以我們才會在網上看到不斷有人在翻閱過代碼后,或者簡單設置了幾個斷點和調試后抱怨 InnoDB 存儲引擎的設計是多么爛。數據庫的世界并不如他們想象的那樣簡單與粗糙,數據庫有著自己的理論體系。雖然數據庫的實現有很多種,但大多需要遵循一些理論規范,如 Fix Rules、Write-Ahead Log、Force-log-at-commit、Lock 等。
我從 2006 年就開始進行數據庫的內核開發,現在想來還最多只能稱為 hack。我在內核開發的路上走了很多彎路,經過高人的指點以及自己不斷的學習與探索,終于有了一些經驗,現通過本書來完整地展示給讀者。希望通過 MySQL 內核系列,使正在通往或已經在數據庫內核開發道路的人員少走彎路。
出于這個目的,我聯合了網易 MySQL 技術組的各位同事,完成了 InnoDB 存儲引擎卷 1 的書籍撰寫工作。其中第 1、3、4、5、7、8、9、10、11 章由我個人獨立完成,第 2 和第 14章由我和溫正湖共同完成、第 6 和第 12 章由我和饒隴輝共同完成、第 13 和第 15 章由我和蔣鴻翔共同完成。在每章的最后,我還給出了思考題以及繼續閱讀的參考資料,通過這部分的內容,讀者可以
加深對于每個知識模塊的理解,并繼續對某一模塊進行深入研究。
本書面向的讀者群:
數據庫管理員
數據庫架構設計師
數據庫內核開發人員
其他對數據庫內核感興趣的開發人員
如何閱讀本書
本書一共有 15 章,每章都像一本“迷你書”,可以單獨成冊。用戶可以有選擇地閱讀,但是更推薦根據本書的組織方式進行閱讀,這樣會更具有條理性。
第 1 章概覽
本章首先介紹了 MySQL 數據庫以及 InnoDB 存儲引擎的歷史,之后介紹了 InnoDB 存儲引擎的源碼結構與代碼風格,最后推薦了閱讀 InnoDB 存儲引擎源碼的次序。
第 2 章基本數據結構與算法
本章對 InnoDB 中常用的數據結構和算法進行了介紹。首先是 InnoDB 的內存管理系統,從內存管理機制、內存操作基元和內存池及內存區等概念著手進行了詳細講解;之后是哈希表結構,介紹了簡單哈希表和帶鏈哈希表兩種;然后介紹了雙鏈表結構;最后還介紹了動態數組、標準排序函數。本章的內容是 InnoDB 的基礎,相信讀者在閱讀后續章節的代碼時一定會遇到本章所提的相關數據結構與算法。
第 3 章同步機制
本章介紹了 InnoDB 存儲引擎中實現的同步機制 mutex 和 rw-lock。InnoDB 存儲引擎正是通過這些數據結構才能完成正確并發控制的。
第 4 章重做日志
本章首先介紹與重做日志模塊相關的概念,之后具體分析了 InnoDB 存儲引擎重做日志模塊的實現。InnoDB 存儲引擎原先就支持組提交,因此有著相當不錯的性能。最后,根據之前所介紹的內容,分析了如何通過重做日志進行有效恢復,從而實現事務系統持久性的要求。
第 5 章 mini-transaction
本章介紹了數據庫中的三個協議:Fix Rules、Write-Ahead Log、Force-Log-at-Commit,同時介紹了 InnoDB 存儲引擎中 mini-transaction 的實現,并通過一個示例簡單展示了 mini-transaction 產生的重做日志內容。
第 6 章存儲管理
本章介紹了 InnoDB 存儲引擎的物理存儲方式,這包括表空間的構成,段、區、頁的存儲管理。此外,還介紹了 InnoDB 存儲引擎的文件操作方式,包括文件操作的架構設計、同步讀 /寫方式和異步讀 / 寫方式,分別介紹了 Windows 操作系統、Posix 操作系統以及 InnoDB 模擬的三種異步 I/O 的實現方法。
第 7 章記錄
本章介紹了 InnoDB 存儲引擎的記錄(record),使讀者了解在源碼中記錄可以分為物理記錄與邏輯記錄,以及各種記錄所使用的場合。
第 8 章索引頁
本章介紹了 InnoDB 存儲引擎的索引頁,知道在源碼中頁可以分為物理頁與邏輯頁,并且詳細分析了 page header 以及 page directory。此外,還對 InnoDB 存儲引擎如何在頁中進行記錄的定位、插入和刪除等操作進行了詳細介紹。
第 9 章鎖
本章介紹了 InnoDB 存儲引擎鎖的實現技術。在 InnoDB 存儲引擎中,其通過 next-keylocking 算法在事務隔離級別為 REPEATABLE READ 實現了完全的隔離性要求。此外,其對鎖的設計是一種極其高效的設計方式。每個內核開發人員都應該細讀 lock 模塊,從而更為深入地理解鎖的內部實現。
第 10 章 B+ 樹索引
本章對 InnoDB 存儲引擎的 B+ 樹索引實現做了十分詳細的介紹。該部分所需要涉及的內容非常多,與前面章節的聯系也比較緊密,是一個極為重要的章節。希望讀者可以反復閱讀,從而更好地體會 InnoDB 存儲引擎中 B+ 樹索引的實現。
第 11 章 Insert Buffer
本章介紹了 InnoDB 存儲引擎中 Insert Buffer 的實現,首先介紹了 Insert Buffer 的基本概念,然后介紹了 Insert Buffer 的物理與邏輯存儲結構,并通過一個示例進行展示。最后,介紹了Insert Buffer 的源碼實現。我認為這個模塊是難度最大的模塊之一。
第 12 章緩沖池
本章介紹了 InnoDB 存儲引擎緩沖池的實現,這包括緩沖池的管理、頁的讀取和頁的刷新。此外,還介紹了 InnoDB 存儲引擎使用 midpoint insertion strategy LRU 的 LRU 管理機制。
第 13 章事務處理
本章介紹了 InnoDB 存儲引擎的事務處理模塊,介紹了 InnoDB 存儲引擎對于 undo 記錄的存儲方式,這其中涉及事務系統段、回滾段、undo 段、undo 頁、undo 日志、undo 記錄等多個概念,讀者應該好好地理清這些概念。此外,還講述了事務的 purge、rollback、commit 等操作的具體實現。相信通過本章的學習讀者可以了解如何設計一個高效的事務系統。
第 14 章數據字典
本章介紹了 InnoDB 存儲引擎對于數據字典的具體實現,以及其與之前各章的聯系。
第 15 章服務管理
本章介紹了 InnoDB 存儲引擎各服務模塊的管理,并展示了這些服務模塊的具體實現。
勘誤和支持
由于水平有限,編寫時間倉促,書中難免會出現一些錯誤或不準確的地方,懇請讀者批評指正,我將盡力在線上為你提供最滿意的解答。如果你有更多的寶貴意見,也歡迎發送郵件至郵箱jiangchengyao@gmail.com,期待能夠得到您最真摯的反饋。
致謝
感謝網易研究院的所有同事們,能與一群才華出眾的人一起工作讓我感到非常榮幸與自豪,同時通過不斷地與他人的交流,使我在數據庫方面得到了極大的提升和領悟。
感謝電子工業出版社博文視點公司的孫學瑛老師,她在這段時間內始終支持我的寫作,正是她的鼓勵和幫助引導我順利完成全部書稿。
謹以此書獻給我最親愛的家人,以及眾多熱愛 MySQL 數據庫的朋友們!
姜承堯(David Jiang)
2014 年4月于中國杭州
?
轉載于:https://www.cnblogs.com/broadview/p/3756983.html
總結
以上是生活随笔為你收集整理的MySQL内核:InnoDB存储引擎 卷1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: unity3d所要知道的基础知识体系大纲
- 下一篇: NOJ---1408----map的运用