MySQL技術(shù)內(nèi)幕:InnoDB存儲引擎(第2版)
定 價(jià):79 元
叢書名:數(shù)據(jù)庫技術(shù)叢書
- 作者:姜承堯 著
- 出版時(shí)間:2013/6/1
- ISBN:9787111422068
- 出 版 社:機(jī)械工業(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ìn)行了全面的補(bǔ)充,還根據(jù)廣大讀者的反饋意見對第1版中存在的不足進(jìn)行了完善,全書大約重寫了50%的內(nèi)容。本書從源代碼的角度深度解析了InnoDB的體系結(jié)構(gòu)、實(shí)現(xiàn)原理、工作機(jī)制,并給出了大量最佳實(shí)踐,能幫助你系統(tǒng)而深入地掌握InnoDB,更重要的是,它能為你設(shè)計(jì)管理高性能、高可用的數(shù)據(jù)庫系統(tǒng)提供絕佳的指導(dǎo)。
《MySQL技術(shù)內(nèi)幕:InnoDB存儲引擎》一共10章,首先宏觀地介紹了MySQL的體系結(jié)構(gòu)和各種常見的存儲引擎以及它們之間的比較;接著以InnoDB的內(nèi)部實(shí)現(xiàn)為切入點(diǎn),逐一詳細(xì)講解了InnoDB存儲引擎內(nèi)部的各個(gè)功能模塊的實(shí)現(xiàn)原理,包括InnoDB存儲引擎的體系結(jié)構(gòu)、內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)、基于InnoDB存儲引擎的表和頁的物理存儲、索引與算法、文件、鎖、事務(wù)、備份與恢復(fù),以及InnoDB的性能調(diào)優(yōu)等重要的知識;最后對InnoDB存儲引擎源代碼的編譯和調(diào)試做了介紹,對大家閱讀和理解InnoDB的源代碼有重要的指導(dǎo)意義。
本書適合所有希望構(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)、核心實(shí)現(xiàn)和工作機(jī)制進(jìn)行深入剖析
為什么要寫這本書
過去這些年我一直在和各種不同的數(shù)據(jù)庫打交道,見證了MySQL從一個(gè)小型的關(guān)系型數(shù)據(jù)庫發(fā)展為各大企業(yè)的核心數(shù)據(jù)庫系統(tǒng)的過程,并且參與了一些大大小小的項(xiàng)目的開發(fā)工作,成功地幫助開發(fā)人員構(gòu)建了可靠的、健壯的應(yīng)用程序。在這個(gè)過程中積累了一些經(jīng)驗(yàn),正是這些不斷累積的經(jīng)驗(yàn)賦予了我靈感,于是有了這本書。這本書實(shí)際上反映了這些年來我做了哪些事情,其中匯集了很多同行每天可能都會(huì)遇到的一些問題,并給出了解決方案。
MySQL數(shù)據(jù)庫獨(dú)有的插件式存儲引擎架構(gòu)使其和其他任何數(shù)據(jù)庫都不同。不同的存儲引擎有著完全不同的功能,而InnoDB存儲引擎的存在使得MySQL躍入了企業(yè)級數(shù)據(jù)庫領(lǐng)域。本書完整地講解了InnoDB存儲引擎中最重要的一些內(nèi)容,即InnoDB的體系結(jié)構(gòu)和工作原理,并結(jié)合InnoDB的源代碼講解了它的內(nèi)部實(shí)現(xiàn)機(jī)制。
本書不僅講述了InnoDB存儲引擎的諸多功能和特性,還闡述了如何正確地使用這些功能和特性,更重要的是,還嘗試了教我們?nèi)绾蜹hink Different。Think Different是20世紀(jì)90年代蘋果公司在其曠日持久的宣傳活動(dòng)中提出的一個(gè)口號,借此來重振公司的品牌,更重要的是,這個(gè)口號改變了人們對技術(shù)在日常生活中的作用的看法。需要注意的是,蘋果的口號不是Think Differently,是Think Different,Different在這里做名詞,意味該思考些什么。
很多DBA和開發(fā)人員都相信某些“神話”,然而這些“神話”往往都是錯(cuò)誤的。無論計(jì)算機(jī)技術(shù)發(fā)展的速度變得多快,數(shù)據(jù)庫的使用變得多么簡單,任何時(shí)候Why都比What重要。只有真正理解了內(nèi)部實(shí)現(xiàn)原理、體系結(jié)構(gòu),才能更好地去使用。這正是人類正確思考問題的原則。因此,對于當(dāng)前出現(xiàn)的技術(shù),盡管學(xué)習(xí)其應(yīng)用很重要,但更重要的是,應(yīng)當(dāng)正確地理解和使用這些技術(shù)。
關(guān)于本書,我的頭腦里有很多個(gè)目標(biāo),但最重要的是想告訴大家如下幾個(gè)簡單的觀點(diǎn):
·不要相信任何的“神話”,學(xué)會(huì)自己思考;
·不要墨守成規(guī),大部分人都知道的事情可能是錯(cuò)誤的;
·不要相信網(wǎng)上的傳言,去測試,根據(jù)自己的實(shí)踐做出決定;
·花時(shí)間充分地思考,敢于提出質(zhì)疑。
當(dāng)前有關(guān)MySQL的書籍大部分都集中在教讀者如何使用MySQL,例如SQL語句的使用、復(fù)制的搭建的、數(shù)據(jù)的切分等。沒錯(cuò),這對快速掌握和使用MySQL數(shù)據(jù)庫非常有好處,但是真正的數(shù)據(jù)庫工作者需要了解的不僅僅是應(yīng)用,更多的是內(nèi)部的具體實(shí)現(xiàn)。
MySQL數(shù)據(jù)庫獨(dú)有的插件式存儲引擎使得想要在一本書內(nèi)完整地講解各個(gè)存儲引擎變得十分困難,有的書可能偏重對MyISAM的介紹,有的可能偏重對InnoDB存儲引擎的介紹。對于初級的DBA來說,這可能會(huì)使他們的理解變得更困難。對于大多數(shù)MySQL DBA和開發(fā)人員來說,他們往往更希望了解作為MySQL企業(yè)級數(shù)據(jù)庫應(yīng)用的第一存儲引擎的InnoDB,我想在本書中,他們完全可以找到他們希望了解的內(nèi)容。
再強(qiáng)調(diào)一遍,任何時(shí)候Why都比What重要,本書從源代碼的角度對InnoDB的存儲引擎的整個(gè)體系架構(gòu)的各個(gè)組成部分進(jìn)行了系統(tǒng)的分析和講解,剖析了InnoDB存儲引擎的核心實(shí)現(xiàn)和工作機(jī)制,相信這在其他書中是很難找到的。
第1版與第2版的區(qū)別
本書是第2版,在寫作中吸收了讀者對上一版內(nèi)容的許多意見和建議,同時(shí)對于最新MySQL 5.6中許多關(guān)于InnoDB存儲引擎的部分進(jìn)行了詳細(xì)的解析與介紹。希望通過這些改進(jìn),給讀者一個(gè)從應(yīng)用到設(shè)計(jì)再到實(shí)現(xiàn)的完整理解,彌補(bǔ)上一版中深度有余,內(nèi)容層次不夠豐富、分析手法單一等諸多不足。
較第1版而言,第2版的改動(dòng)非常大,基本上重寫了50%的內(nèi)容。其主要體現(xiàn)在以下幾個(gè)方面,希望讀者能夠在閱讀中體會(huì)到。
·本書增加了對最新MySQL 5.6中的InnoDB存儲引擎特性的介紹。MySQL 5.6版本是有史以來最大的一次更新,InnoDB存儲引擎更是添加了許多功能,如多線程清理線程、全文索引、在線索引添加、獨(dú)立回滾段、非遞歸死鎖檢測、新的刷新算法、新的元數(shù)據(jù)表等。讀者通過本書可以知道如何使用這些特性、新特性存在的局限性,并明白新功能與老版本InnoDB存儲引擎之間實(shí)現(xiàn)的區(qū)別,從而在實(shí)際應(yīng)用中充分利用這些特性。
·根據(jù)讀者的要求對于InnoDB存儲引擎的redo日志和undo日志進(jìn)行了詳細(xì)的分析。讀者應(yīng)該能更好地理解InnoDB存儲引擎事務(wù)的實(shí)現(xiàn)。在undo日志分析中,通過InnoSQL自帶的元數(shù)據(jù)表,用戶終于可對undo日志進(jìn)行統(tǒng)計(jì)和分析,極大提高了DBA對于InnoDB存儲引擎內(nèi)部的認(rèn)知。
·對第6章進(jìn)行大幅度的重寫,讀者可以更好地理解InnoDB存儲引擎特有的next-key locking算法,并且通過分析鎖的實(shí)現(xiàn)來了解死鎖可能產(chǎn)生的情況,以及InnoDB存儲引擎內(nèi)部是如何來避免死鎖問題的產(chǎn)生的。
·根據(jù)讀者的反饋,對InnoDB存儲引擎的insert buffer模塊實(shí)現(xiàn)進(jìn)行了更為詳細(xì)的介紹,讀者可以了解其使用方法以及其內(nèi)部的實(shí)現(xiàn)原理。此外還增加了對insert buffer的升級版本功能——change buffer的介紹。
讀者對象
本書不是一本面向應(yīng)用的數(shù)據(jù)庫類書籍,也不是一本參考手冊,更不會(huì)教你如何在MySQL中使用SQL語句。本書面向那些使用MySQL InnoDB存儲引擎作為數(shù)據(jù)庫后端開發(fā)應(yīng)用程序的開發(fā)者和有一定經(jīng)驗(yàn)的MySQL DBA。書中的大部分例子都是用SQL語句來展示關(guān)鍵特性的,如果想通過本書來了解如何啟動(dòng)MySQL、如何配置Replication環(huán)境,可能并不能如愿。不過,在本書中,你將知道InnoDB存儲引擎是如何工作的,它的關(guān)鍵特性的功能和作用是什么,以及如何正確配置和使用這些特性。
如果你想更好地使用InnoDB存儲引擎,如果你想讓你的數(shù)據(jù)庫應(yīng)用獲得更好的性能,就請閱讀本書。從某種程度上講,技術(shù)經(jīng)理或總監(jiān)也要非常了解數(shù)據(jù)庫,要知道數(shù)據(jù)庫對于企業(yè)的重要性。如果技術(shù)經(jīng)理或總監(jiān)想安排員工參加MySQL數(shù)據(jù)庫技術(shù)方面的培訓(xùn),完全可以利用本書來“充電”,相信你一定不會(huì)失望的。
要想更好地學(xué)習(xí)本書的內(nèi)容,要求具備以下條件:
·掌握SQL。
·掌握基本的MySQL操作。
·接觸過一些高級語言,如C、C++、Python或Java。
·對一些基本算法有所了解,因?yàn)楸緯鴷?huì)分析InnoDB存儲引擎的部分源代碼,如果你能看懂這些算法,這會(huì)對你的理解非常有幫助。
如何閱讀本書
本書一共有10章,每一章都像一本“迷你書”,可以單獨(dú)成冊,也就說你完全可以從書中任何一章開始閱讀。例如,要了解第10章中的InnoDB源代碼編譯和調(diào)試的知識,就不必先去閱讀第3章有關(guān)文件的知識。當(dāng)然,如果你不太確定自己是否已經(jīng)對本書所涉及的內(nèi)容完全掌握了,建議你系統(tǒng)性地閱讀本書。
本書不是一本入門書籍,不會(huì)一步步引導(dǎo)你去如何操作。倘若你尚不了解InnoDB存儲引擎,本書對你來說可能就顯得沉重一些,建議你先查閱官方的API文檔,大致掌握InnoDB的基礎(chǔ)知識,然后再來學(xué)習(xí)本書,相信你會(huì)領(lǐng)略到不同的風(fēng)景。
為了便于大家閱讀,本書在提供源代碼下載的同時(shí)也將源代碼附在了書中,因此占去了一些篇幅,還請大家理解。
致謝
在編寫本書的過程中,我得到了很多朋友的熱心幫助。首先要感謝Pecona公司的CEO Peter Zaitsev和CTO Vadim Tkachenko,通過和他們的不斷交流,使我對InnoDB存儲引擎有了更進(jìn)一步的了解,同時(shí)知道了怎樣才能正確地將InnoDB存儲引擎的補(bǔ)丁應(yīng)用到生產(chǎn)環(huán)境。
其次,要感謝網(wǎng)易公司的各位同事們,能在才華橫溢、充滿創(chuàng)意的團(tuán)隊(duì)中工作我感到非常榮幸和興奮。也因?yàn)樵谶@個(gè)開放的工作環(huán)境中,我可以不斷進(jìn)行研究和創(chuàng)新。
此外,我還要感謝我的母親,寫本書不是一件容易的事,特別是這本書還想傳達(dá)一些思想,在這個(gè)過程中我遇到了很多的困難,感謝她在這個(gè)過程中給予我的支持和鼓勵(lì)。
最后,一份特別的感謝要送給本書的策劃編輯楊福川和姜影,他們使得本書變得生動(dòng)和更具有靈魂。此外還要感謝出版社的其他默默工作的同事們。
姜承堯
姜承堯(David Jiang),資深MySQL數(shù)據(jù)庫專家,擅長于數(shù)據(jù)庫的故障診斷、性能調(diào)優(yōu)、容災(zāi)處理、高可用和高擴(kuò)展研究,同時(shí)一直致力于MySQL數(shù)據(jù)庫底層實(shí)現(xiàn)原理的研究和探索。此外,對高性能數(shù)據(jù)庫和數(shù)據(jù)倉庫也有深刻而獨(dú)到的理解。曾為MySQL編寫了許多開源工具和性能擴(kuò)展補(bǔ)丁,如廣受好評的InnoDB引擎二級緩存項(xiàng)目,F(xiàn)任網(wǎng)易杭州研究院技術(shù)經(jīng)理一職,負(fù)責(zé)MySQL數(shù)據(jù)庫的內(nèi)核開發(fā),參與設(shè)計(jì)與開發(fā)MySQL數(shù)據(jù)庫在網(wǎng)易云環(huán)境中的應(yīng)用。曾擔(dān)任久游網(wǎng)數(shù)據(jù)庫工程部經(jīng)理,曾領(lǐng)導(dǎo)并參與了多個(gè)大型核心數(shù)據(jù)庫的設(shè)計(jì)、實(shí)施、管理和維護(hù),實(shí)戰(zhàn)經(jīng)驗(yàn)非常豐富;钴S于開源數(shù)據(jù)庫以及開源軟件領(lǐng)域,是著名開源社區(qū)ChinaUnix MySQL版塊的版主,熱衷于與網(wǎng)友分享自己的心得和體會(huì),深受社區(qū)歡迎。
除本書外,他還撰寫了《MySQL技術(shù)內(nèi)幕:SQL編程》,是本書的姊妹篇,頗受好評。
推薦序
前言
第1章 MySQL體系結(jié)構(gòu)和存儲引擎
1.1 定義數(shù)據(jù)庫和實(shí)例
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 自適應(yīng)哈希索引
2.6.4 異步IO
2.6.5 刷新鄰接頁
2.7 啟動(dòng)、關(guān)閉與恢復(fù)
2.8 小結(jié)
第3章 文件
3.1 參數(shù)文件
3.1.1 什么是參數(shù)
3.1.2 參數(shù)類型
3.2 日志文件
3.2.1 錯(cuò)誤日志
3.2.2 慢查詢?nèi)罩?br />3.2.3 查詢?nèi)罩?br />3.2.4 二進(jìn)制日志
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機(jī)制
4.6 約束
4.6.1 數(shù)據(jù)完整性
4.6.2 約束的創(chuàng)建和查找
4.6.3 約束和索引的區(qū)別
4.6.4 對錯(cuò)誤數(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)計(jì)
5.6 B+樹索引的使用
5.6.1 不同應(yīng)用中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 自適應(yīng)哈希索引
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 不可重復(fù)讀
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 認(rèn)識事務(wù)
7.1.1 概述
7.1.2 分類
7.2 事務(wù)的實(shí)現(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)計(jì)
7.6 事務(wù)的隔離級別
7.7 分布式事務(wù)
7.7.1 MySQL數(shù)據(jù)庫分布式事務(wù)
7.7.2 內(nèi)部XA事務(wù)
7.8 不好的事務(wù)習(xí)慣
7.8.1 在循環(huán)中提交
7.8.2 使用自動(dòng)提交
7.8.3 使用自動(dòng)回滾
7.9 長事務(wù)
7.10 小結(jié)
第8章 備份與恢復(fù)
8.1 備份與恢復(fù)概述
8.2 冷備
8.3 邏輯備份
8.3.1 mysqldump
8.3.2 SELECT...INTO OUTFILE
8.3.3 邏輯備份的恢復(fù)
8.3.4 LOAD DATA INFILE
8.3.5 mysqlimport
8.4 二進(jìn)制日志備份與恢復(fù)
8.5 熱備
8.5.1 ibbackup
8.5.2 XtraBackup
8.5.3 XtraBackup實(shí)現(xiàn)增量備份
8.6 快照備份
8.7 復(fù)制
8.7.1 復(fù)制的工作原理
8.7.2 快照+復(fù)制的備份架構(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)機(jī)械硬盤
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 選擇合適的基準(zhǔn)測試工具
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é)