MySQL技術(shù)內(nèi)幕:InnoDB存儲引擎(第2版)
定 價:79 元
叢書名:數(shù)據(jù)庫技術(shù)叢書
- 作者:姜承堯 著
- 出版時間:2013/6/1
- ISBN:9787111422068
- 出 版 社:機械工業(yè)出版社
- 中圖法分類:TP311.138
- 頁碼:436
- 紙張:膠版紙
- 版次:2
- 開本:16開
《MySQL技術(shù)內(nèi)幕:InnoDB存儲引擎》由國內(nèi)資深MySQL專家親自執(zhí)筆,國內(nèi)外多位數(shù)據(jù)庫專家聯(lián)袂推薦。作為國內(nèi)唯一一本關(guān)于InnoDB的專著,本書的第1版廣受好評,第2版不僅針對最新的MySQL 5.6對相關(guān)內(nèi)容進行了全面的補充,還根據(jù)廣大讀者的反饋意見對第1版中存在的不足進行了完善,全書大約重寫了50%的內(nèi)容。本書從源代碼的角度深度解析了InnoDB的體系結(jié)構(gòu)、實現(xiàn)原理、工作機制,并給出了大量最佳實踐,能幫助你系統(tǒng)而深入地掌握InnoDB,更重要的是,它能為你設(shè)計管理高性能、高可用的數(shù)據(jù)庫系統(tǒng)提供絕佳的指導。
《MySQL技術(shù)內(nèi)幕:InnoDB存儲引擎》一共10章,首先宏觀地介紹了MySQL的體系結(jié)構(gòu)和各種常見的存儲引擎以及它們之間的比較;接著以InnoDB的內(nèi)部實現(xiàn)為切入點,逐一詳細講解了InnoDB存儲引擎內(nèi)部的各個功能模塊的實現(xiàn)原理,包括InnoDB存儲引擎的體系結(jié)構(gòu)、內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)、基于InnoDB存儲引擎的表和頁的物理存儲、索引與算法、文件、鎖、事務(wù)、備份與恢復,以及InnoDB的性能調(diào)優(yōu)等重要的知識;最后對InnoDB存儲引擎源代碼的編譯和調(diào)試做了介紹,對大家閱讀和理解InnoDB的源代碼有重要的指導意義。
本書適合所有希望構(gòu)建和管理高性能、高可用性的MySQL數(shù)據(jù)庫系統(tǒng)的開發(fā)者和DBA閱讀。
暢銷書全新升級,第1版廣獲好評;資深MySQL專家撰寫,全球知名MySQL數(shù)據(jù)庫服務(wù)提供商Percona公司CTO作序推薦,國內(nèi)多位數(shù)據(jù)庫專家聯(lián)袂推薦 基于MySQL 5.6,結(jié)合源代碼,從存儲引擎內(nèi)核角度對InnoDB的整體架構(gòu)、核心實現(xiàn)和工作機制進行深入剖析
為什么要寫這本書
過去這些年我一直在和各種不同的數(shù)據(jù)庫打交道,見證了MySQL從一個小型的關(guān)系型數(shù)據(jù)庫發(fā)展為各大企業(yè)的核心數(shù)據(jù)庫系統(tǒng)的過程,并且參與了一些大大小小的項目的開發(fā)工作,成功地幫助開發(fā)人員構(gòu)建了可靠的、健壯的應用程序。在這個過程中積累了一些經(jīng)驗,正是這些不斷累積的經(jīng)驗賦予了我靈感,于是有了這本書。這本書實際上反映了這些年來我做了哪些事情,其中匯集了很多同行每天可能都會遇到的一些問題,并給出了解決方案。
MySQL數(shù)據(jù)庫獨有的插件式存儲引擎架構(gòu)使其和其他任何數(shù)據(jù)庫都不同。不同的存儲引擎有著完全不同的功能,而InnoDB存儲引擎的存在使得MySQL躍入了企業(yè)級數(shù)據(jù)庫領(lǐng)域。本書完整地講解了InnoDB存儲引擎中最重要的一些內(nèi)容,即InnoDB的體系結(jié)構(gòu)和工作原理,并結(jié)合InnoDB的源代碼講解了它的內(nèi)部實現(xiàn)機制。
本書不僅講述了InnoDB存儲引擎的諸多功能和特性,還闡述了如何正確地使用這些功能和特性,更重要的是,還嘗試了教我們?nèi)绾蜹hink Different。Think Different是20世紀90年代蘋果公司在其曠日持久的宣傳活動中提出的一個口號,借此來重振公司的品牌,更重要的是,這個口號改變了人們對技術(shù)在日常生活中的作用的看法。需要注意的是,蘋果的口號不是Think Differently,是Think Different,Different在這里做名詞,意味該思考些什么。
很多DBA和開發(fā)人員都相信某些“神話”,然而這些“神話”往往都是錯誤的。無論計算機技術(shù)發(fā)展的速度變得多快,數(shù)據(jù)庫的使用變得多么簡單,任何時候Why都比What重要。只有真正理解了內(nèi)部實現(xiàn)原理、體系結(jié)構(gòu),才能更好地去使用。這正是人類正確思考問題的原則。因此,對于當前出現(xiàn)的技術(shù),盡管學習其應用很重要,但更重要的是,應當正確地理解和使用這些技術(shù)。
關(guān)于本書,我的頭腦里有很多個目標,但最重要的是想告訴大家如下幾個簡單的觀點:
·不要相信任何的“神話”,學會自己思考;
·不要墨守成規(guī),大部分人都知道的事情可能是錯誤的;
·不要相信網(wǎng)上的傳言,去測試,根據(jù)自己的實踐做出決定;
·花時間充分地思考,敢于提出質(zhì)疑。
當前有關(guān)MySQL的書籍大部分都集中在教讀者如何使用MySQL,例如SQL語句的使用、復制的搭建的、數(shù)據(jù)的切分等。沒錯,這對快速掌握和使用MySQL數(shù)據(jù)庫非常有好處,但是真正的數(shù)據(jù)庫工作者需要了解的不僅僅是應用,更多的是內(nèi)部的具體實現(xiàn)。
MySQL數(shù)據(jù)庫獨有的插件式存儲引擎使得想要在一本書內(nèi)完整地講解各個存儲引擎變得十分困難,有的書可能偏重對MyISAM的介紹,有的可能偏重對InnoDB存儲引擎的介紹。對于初級的DBA來說,這可能會使他們的理解變得更困難。對于大多數(shù)MySQL DBA和開發(fā)人員來說,他們往往更希望了解作為MySQL企業(yè)級數(shù)據(jù)庫應用的第一存儲引擎的InnoDB,我想在本書中,他們完全可以找到他們希望了解的內(nèi)容。
再強調(diào)一遍,任何時候Why都比What重要,本書從源代碼的角度對InnoDB的存儲引擎的整個體系架構(gòu)的各個組成部分進行了系統(tǒng)的分析和講解,剖析了InnoDB存儲引擎的核心實現(xiàn)和工作機制,相信這在其他書中是很難找到的。
第1版與第2版的區(qū)別
本書是第2版,在寫作中吸收了讀者對上一版內(nèi)容的許多意見和建議,同時對于最新MySQL 5.6中許多關(guān)于InnoDB存儲引擎的部分進行了詳細的解析與介紹。希望通過這些改進,給讀者一個從應用到設(shè)計再到實現(xiàn)的完整理解,彌補上一版中深度有余,內(nèi)容層次不夠豐富、分析手法單一等諸多不足。
較第1版而言,第2版的改動非常大,基本上重寫了50%的內(nèi)容。其主要體現(xiàn)在以下幾個方面,希望讀者能夠在閱讀中體會到。
·本書增加了對最新MySQL 5.6中的InnoDB存儲引擎特性的介紹。MySQL 5.6版本是有史以來最大的一次更新,InnoDB存儲引擎更是添加了許多功能,如多線程清理線程、全文索引、在線索引添加、獨立回滾段、非遞歸死鎖檢測、新的刷新算法、新的元數(shù)據(jù)表等。讀者通過本書可以知道如何使用這些特性、新特性存在的局限性,并明白新功能與老版本InnoDB存儲引擎之間實現(xiàn)的區(qū)別,從而在實際應用中充分利用這些特性。
·根據(jù)讀者的要求對于InnoDB存儲引擎的redo日志和undo日志進行了詳細的分析。讀者應該能更好地理解InnoDB存儲引擎事務(wù)的實現(xiàn)。在undo日志分析中,通過InnoSQL自帶的元數(shù)據(jù)表,用戶終于可對undo日志進行統(tǒng)計和分析,極大提高了DBA對于InnoDB存儲引擎內(nèi)部的認知。
·對第6章進行大幅度的重寫,讀者可以更好地理解InnoDB存儲引擎特有的next-key locking算法,并且通過分析鎖的實現(xiàn)來了解死鎖可能產(chǎn)生的情況,以及InnoDB存儲引擎內(nèi)部是如何來避免死鎖問題的產(chǎn)生的。
·根據(jù)讀者的反饋,對InnoDB存儲引擎的insert buffer模塊實現(xiàn)進行了更為詳細的介紹,讀者可以了解其使用方法以及其內(nèi)部的實現(xiàn)原理。此外還增加了對insert buffer的升級版本功能——change buffer的介紹。
讀者對象
本書不是一本面向應用的數(shù)據(jù)庫類書籍,也不是一本參考手冊,更不會教你如何在MySQL中使用SQL語句。本書面向那些使用MySQL InnoDB存儲引擎作為數(shù)據(jù)庫后端開發(fā)應用程序的開發(fā)者和有一定經(jīng)驗的MySQL DBA。書中的大部分例子都是用SQL語句來展示關(guān)鍵特性的,如果想通過本書來了解如何啟動MySQL、如何配置Replication環(huán)境,可能并不能如愿。不過,在本書中,你將知道InnoDB存儲引擎是如何工作的,它的關(guān)鍵特性的功能和作用是什么,以及如何正確配置和使用這些特性。
如果你想更好地使用InnoDB存儲引擎,如果你想讓你的數(shù)據(jù)庫應用獲得更好的性能,就請閱讀本書。從某種程度上講,技術(shù)經(jīng)理或總監(jiān)也要非常了解數(shù)據(jù)庫,要知道數(shù)據(jù)庫對于企業(yè)的重要性。如果技術(shù)經(jīng)理或總監(jiān)想安排員工參加MySQL數(shù)據(jù)庫技術(shù)方面的培訓,完全可以利用本書來“充電”,相信你一定不會失望的。
要想更好地學習本書的內(nèi)容,要求具備以下條件:
·掌握SQL。
·掌握基本的MySQL操作。
·接觸過一些高級語言,如C、C++、Python或Java。
·對一些基本算法有所了解,因為本書會分析InnoDB存儲引擎的部分源代碼,如果你能看懂這些算法,這會對你的理解非常有幫助。
如何閱讀本書
本書一共有10章,每一章都像一本“迷你書”,可以單獨成冊,也就說你完全可以從書中任何一章開始閱讀。例如,要了解第10章中的InnoDB源代碼編譯和調(diào)試的知識,就不必先去閱讀第3章有關(guān)文件的知識。當然,如果你不太確定自己是否已經(jīng)對本書所涉及的內(nèi)容完全掌握了,建議你系統(tǒng)性地閱讀本書。
本書不是一本入門書籍,不會一步步引導你去如何操作。倘若你尚不了解InnoDB存儲引擎,本書對你來說可能就顯得沉重一些,建議你先查閱官方的API文檔,大致掌握InnoDB的基礎(chǔ)知識,然后再來學習本書,相信你會領(lǐng)略到不同的風景。
為了便于大家閱讀,本書在提供源代碼下載的同時也將源代碼附在了書中,因此占去了一些篇幅,還請大家理解。
致謝
在編寫本書的過程中,我得到了很多朋友的熱心幫助。首先要感謝Pecona公司的CEO Peter Zaitsev和CTO Vadim Tkachenko,通過和他們的不斷交流,使我對InnoDB存儲引擎有了更進一步的了解,同時知道了怎樣才能正確地將InnoDB存儲引擎的補丁應用到生產(chǎn)環(huán)境。
其次,要感謝網(wǎng)易公司的各位同事們,能在才華橫溢、充滿創(chuàng)意的團隊中工作我感到非常榮幸和興奮。也因為在這個開放的工作環(huán)境中,我可以不斷進行研究和創(chuàng)新。
此外,我還要感謝我的母親,寫本書不是一件容易的事,特別是這本書還想傳達一些思想,在這個過程中我遇到了很多的困難,感謝她在這個過程中給予我的支持和鼓勵。
最后,一份特別的感謝要送給本書的策劃編輯楊福川和姜影,他們使得本書變得生動和更具有靈魂。此外還要感謝出版社的其他默默工作的同事們。
姜承堯
姜承堯(David Jiang),資深MySQL數(shù)據(jù)庫專家,擅長于數(shù)據(jù)庫的故障診斷、性能調(diào)優(yōu)、容災處理、高可用和高擴展研究,同時一直致力于MySQL數(shù)據(jù)庫底層實現(xiàn)原理的研究和探索。此外,對高性能數(shù)據(jù)庫和數(shù)據(jù)倉庫也有深刻而獨到的理解。曾為MySQL編寫了許多開源工具和性能擴展補丁,如廣受好評的InnoDB引擎二級緩存項目。現(xiàn)任網(wǎng)易杭州研究院技術(shù)經(jīng)理一職,負責MySQL數(shù)據(jù)庫的內(nèi)核開發(fā),參與設(shè)計與開發(fā)MySQL數(shù)據(jù)庫在網(wǎng)易云環(huán)境中的應用。曾擔任久游網(wǎng)數(shù)據(jù)庫工程部經(jīng)理,曾領(lǐng)導并參與了多個大型核心數(shù)據(jù)庫的設(shè)計、實施、管理和維護,實戰(zhàn)經(jīng)驗非常豐富;钴S于開源數(shù)據(jù)庫以及開源軟件領(lǐng)域,是著名開源社區(qū)ChinaUnix MySQL版塊的版主,熱衷于與網(wǎng)友分享自己的心得和體會,深受社區(qū)歡迎。
除本書外,他還撰寫了《MySQL技術(shù)內(nèi)幕:SQL編程》,是本書的姊妹篇,頗受好評。
推薦序
前言
第1章 MySQL體系結(jié)構(gòu)和存儲引擎
1.1 定義數(shù)據(jù)庫和實例
1.2 MySQL體系結(jié)構(gòu)
1.3 MySQL存儲引擎
1.3.1 InnoDB存儲引擎
1.3.2 MyISAM存儲引擎
1.3.3 NDB存儲引擎
1.3.4 Memory存儲引擎
1.3.5 Archive存儲引擎
1.3.6 Federated存儲引擎
1.3.7 Maria存儲引擎
1.3.8 其他存儲引擎
1.4 各存儲引擎之間的比較
1.5 連接MySQL
1.5.1 TCP/IP
1.5.2 命名管道和共享內(nèi)存
1.5.3 UNIX域套接字
1.6 小結(jié)
第2章 InnoDB存儲引擎
2.1 InnoDB存儲引擎概述
2.2 InnoDB存儲引擎的版本
2.3 InnoDB體系架構(gòu)
2.3.1 后臺線程
2.3.2 內(nèi)存
2.4 Checkpoint技術(shù)
2.5 Master Thread工作方式
2.5.1 InnoDB 1.0.x版本之前的Master Thread
2.5.2 InnoDB1.2.x版本之前的Master Thread
2.5.3 InnoDB1.2.x版本的Master Thread
2.6 InnoDB關(guān)鍵特性
2.6.1 插入緩沖
2.6.2 兩次寫
2.6.3 自適應哈希索引
2.6.4 異步IO
2.6.5 刷新鄰接頁
2.7 啟動、關(guān)閉與恢復
2.8 小結(jié)
第3章 文件
3.1 參數(shù)文件
3.1.1 什么是參數(shù)
3.1.2 參數(shù)類型
3.2 日志文件
3.2.1 錯誤日志
3.2.2 慢查詢?nèi)罩?br />3.2.3 查詢?nèi)罩?br />3.2.4 二進制日志
3.3 套接字文件
3.4 pid文件
3.5 表結(jié)構(gòu)定義文件
3.6 InnoDB存儲引擎文件
3.6.1 表空間文件
3.6.2 重做日志文件
3.7 小結(jié)
第4章 表
4.1 索引組織表
4.2 InnoDB邏輯存儲結(jié)構(gòu)
4.2.1 表空間
4.2.2 段
4.2.3 區(qū)
4.2.4 頁
4.2.5 行
4.3 InnoDB行記錄格式
4.3.1 Compact行記錄格式
4.3.2 Redundant行記錄格式
4.3.3 行溢出數(shù)據(jù)
4.3.4 Compressed和Dynamic行記錄格式
4.3.5 CHAR的行結(jié)構(gòu)存儲
4.4 InnoDB數(shù)據(jù)頁結(jié)構(gòu)
4.4.1 File Header
4.4.2 Page Header
4.4.3 Infimum和Supremum Records
4.4.4 User Records和Free Space
4.4.5 Page Directory
4.4.6 File Trailer
4.4.7 InnoDB數(shù)據(jù)頁結(jié)構(gòu)示例分析
4.5 Named File Formats機制
4.6 約束
4.6.1 數(shù)據(jù)完整性
4.6.2 約束的創(chuàng)建和查找
4.6.3 約束和索引的區(qū)別
4.6.4 對錯誤數(shù)據(jù)的約束
4.6.5 ENUM和SET約束
4.6.6 觸發(fā)器與約束
4.6.7 外鍵約束
4.7 視圖
4.7.1 視圖的作用
4.7.2 物化視圖
4.8 分區(qū)表
4.8.1 分區(qū)概述
4.8.2 分區(qū)類型
4.8.3 子分區(qū)
4.8.4 分區(qū)中的NULL值
4.8.5 分區(qū)和性能
4.8.6 在表和分區(qū)間交換數(shù)據(jù)
4.9 小結(jié)
第5章 索引與算法
5.1 InnoDB存儲引擎索引概述
5.2 數(shù)據(jù)結(jié)構(gòu)與算法
5.2.1 二分查找法
5.2.2 二叉查找樹和平衡二叉樹
5.3 B+樹
5.3.1 B+樹的插入操作
5.3.2 B+樹的刪除操作
5.4 B+樹索引
5.4.1 聚集索引
5.4.2 輔助索引
5.4.3 B+樹索引的分裂
5.4.4 B+樹索引的管理
5.5 Cardinality值
5.5.1 什么是Cardinality
5.5.2 InnoDB存儲引擎的Cardinality統(tǒng)計
5.6 B+樹索引的使用
5.6.1 不同應用中B+樹索引的使用
5.6.2 聯(lián)合索引
5.6.3 覆蓋索引
5.6.4 優(yōu)化器選擇不使用索引的情況
5.6.5 索引提示
5.6.6 Multi-Range Read優(yōu)化
5.6.7 Index Condition Pushdown(ICP)優(yōu)化
5.7 哈希算法
5.7.1 哈希表
5.7.2 InnoDB存儲引擎中的哈希算法
5.7.3 自適應哈希索引
5.8 全文檢索
5.8.1 概述
5.8.2 倒排索引
5.8.3 InnoDB全文檢索
5.8.4 全文檢索
5.9 小結(jié)
第6章 鎖
6.1 什么是鎖
6.2 lock與latch
6.3 InnoDB存儲引擎中的鎖
6.3.1 鎖的類型
6.3.2 一致性非鎖定讀
6.3.3 一致性鎖定讀
6.3.4 自增長與鎖
6.3.5 外鍵和鎖
6.4 鎖的算法
6.4.1 行鎖的3種算法
6.4.2 解決Phantom Problem
6.5 鎖問題
6.5.1 臟讀
6.5.2 不可重復讀
6.5.3 丟失更新
6.6 阻塞
6.7 死鎖
6.7.1 死鎖的概念
6.7.2 死鎖概率
6.7.3 死鎖的示例
6.8 鎖升級
6.9 小結(jié)
第7章 事務(wù)
7.1 認識事務(wù)
7.1.1 概述
7.1.2 分類
7.2 事務(wù)的實現(xiàn)
7.2.1 redo
7.2.2 undo
7.2.3 purge
7.2.4 group commit
7.3 事務(wù)控制語句
7.4 隱式提交的SQL語句
7.5 對于事務(wù)操作的統(tǒng)計
7.6 事務(wù)的隔離級別
7.7 分布式事務(wù)
7.7.1 MySQL數(shù)據(jù)庫分布式事務(wù)
7.7.2 內(nèi)部XA事務(wù)
7.8 不好的事務(wù)習慣
7.8.1 在循環(huán)中提交
7.8.2 使用自動提交
7.8.3 使用自動回滾
7.9 長事務(wù)
7.10 小結(jié)
第8章 備份與恢復
8.1 備份與恢復概述
8.2 冷備
8.3 邏輯備份
8.3.1 mysqldump
8.3.2 SELECT...INTO OUTFILE
8.3.3 邏輯備份的恢復
8.3.4 LOAD DATA INFILE
8.3.5 mysqlimport
8.4 二進制日志備份與恢復
8.5 熱備
8.5.1 ibbackup
8.5.2 XtraBackup
8.5.3 XtraBackup實現(xiàn)增量備份
8.6 快照備份
8.7 復制
8.7.1 復制的工作原理
8.7.2 快照+復制的備份架構(gòu)
8.8 小結(jié)
第9章 性能調(diào)優(yōu)
9.1 選擇合適的CPU
9.2 內(nèi)存的重要性
9.3 硬盤對數(shù)據(jù)庫性能的影響
9.3.1 傳統(tǒng)機械硬盤
9.3.2 固態(tài)硬盤
9.4 合理地設(shè)置RAID
9.4.1 RAID類型
9.4.2 RAID Write Back功能
9.4.3 RAID配置工具
9.5 操作系統(tǒng)的選擇
9.6 不同的文件系統(tǒng)對數(shù)據(jù)庫性能的影響
9.7 選擇合適的基準測試工具
9.7.1 sysbench
9.7.2 mysql-tpcc
9.8 小結(jié)
第10章 InnoDB存儲引擎源代碼的編譯和調(diào)試
10.1 獲取InnoDB存儲引擎源代碼
10.2 InnoDB源代碼結(jié)構(gòu)
10.3 MySQL 5.1版本編譯和調(diào)試InnoDB源代碼
10.3.1 Windows下的調(diào)試
10.3.2 Linux下的調(diào)試
10.4 cmake方式編譯和調(diào)試InnoDB存儲引擎
10.5 小結(jié)