編輯推薦
暢銷書全新升級,第1版廣獲好評;資深MySQL專傢撰寫,全球知名MySQL數據庫服務提供商Percona公司CTO作序推薦,國內多位數據庫專傢聯袂推薦
基於MySQL 5.6,結閤源代碼,從存儲引擎內核角度對InnoDB的整體架構、核心實現和工作機製進行深入剖析
更多精彩,點擊進入品牌店查閱>>
內容簡介
《MySQL技術內幕:InnoDB存儲引擎》由國內資深MySQL專傢親自執筆,國內外多位數據庫專傢聯袂推薦。作為國內一本關於InnoDB的專著,本書的第1版廣受好評,第2版不僅針對全新的MySQL 5.6對相關內容進行瞭全麵的補充,還根據廣大讀者的反饋意見對第1版中存在的不足進行瞭完善,全書大約重寫瞭50%的內容。本書從源代碼的角度深度解析瞭InnoDB的體係結構、實現原理、工作機製,並給齣瞭大量實踐,能幫助你係統而深入地掌握InnoDB,更重要的是,它能為你設計管理高性能、高可用的數據庫係統提供專業的指導。
《MySQL技術內幕:InnoDB存儲引擎》一共10章,首先宏觀地介紹瞭MySQL的體係結構和各種常見的存儲引擎以及它們之間的比較;接著以InnoDB的內部實現為切入點,逐一詳細講解瞭InnoDB存儲引擎內部的各個功能模塊的實現原理,包括InnoDB存儲引擎的體係結構、內存中的數據結構、基於InnoDB存儲引擎的錶和頁的物理存儲、索引與算法、文件、鎖、事務、備份與恢復,以及InnoDB的性能調優等重要的知識;最後對InnoDB存儲引擎源代碼的編譯和調試做瞭介紹,對大傢閱讀和理解InnoDB的源代碼有重要的指導意義。
本書適閤所有希望構建和管理高性能、高可用性的MySQL數據庫係統的開發者和DBA閱讀。
作者簡介
薑承堯(David Jiang),資深MySQL數據庫專傢,擅長於數據庫的故障診斷、性能調優、容災處理、高可用和高擴展研究,同時一直緻力於MySQL數據庫底層實現原理的研究和探索。此外,對高性能數據庫和數據倉庫也有深刻而獨到的理解。曾為MySQL編寫瞭許多開源工具和性能擴展補丁,如廣受好評的InnoDB引擎二級緩存項目。現任網易杭州研究院技術經理一職,負責MySQL數據庫的內核開發,參與設計與開發MySQL數據庫在網易雲環境中的應用。曾擔任久遊網數據庫工程部經理,曾領導並參與瞭多個大型核心數據庫的設計、實施、管理和維護,實戰經驗非常豐富。活躍於開源數據庫以及開源軟件領域,是著名開源社區ChinaUnix MySQL版塊的版主,熱衷於與網友分享自己的心得和體會,深受社區歡迎。
除本書外,他還撰寫瞭《MySQL技術內幕:SQL編程》,是本書的姊妹篇,頗受好評。
目錄
推薦序
前言
第1章 MySQL體係結構和存儲引擎
1.1 定義數據庫和實例
1.2 MySQL體係結構
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 命名管道和共享內存
1.5.3 UNIX域套接字
1.6 小結
第2章 InnoDB存儲引擎
2.1 InnoDB存儲引擎概述
2.2 InnoDB存儲引擎的版本
2.3 InnoDB體係架構
2.3.1 後颱綫程
2.3.2 內存
2.4 Checkpoint技術
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關鍵特性
2.6.1 插入緩衝
2.6.2 兩次寫
2.6.3 自適應哈希索引
2.6.4 異步IO
2.6.5 刷新鄰接頁
2.7 啓動、關閉與恢復
2.8 小結
第3章 文件
3.1 參數文件
3.1.1 什麼是參數
3.1.2 參數類型
3.2 日誌文件
3.2.1 錯誤日誌
3.2.2 慢查詢日誌
3.2.3 查詢日誌
3.2.4 二進製日誌
3.3 套接字文件
3.4 pid文件
3.5 錶結構定義文件
3.6 InnoDB存儲引擎文件
3.6.1 錶空間文件
3.6.2 重做日誌文件
3.7 小結
第4章 錶
4.1 索引組織錶
4.2 InnoDB邏輯存儲結構
4.2.1 錶空間
4.2.2 段
4.2.3 區
4.2.4 頁
4.2.5 行
4.3 InnoDB行記錄格式
4.3.1 Compact行記錄格式
4.3.2 Redundant行記錄格式
4.3.3 行溢齣數據
4.3.4 Compressed和Dynamic行記錄格式
4.3.5 CHAR的行結構存儲
4.4 InnoDB數據頁結構
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數據頁結構示例分析
4.5 Named File Formats機製
4.6 約束
4.6.1 數據完整性
4.6.2 約束的創建和查找
4.6.3 約束和索引的區彆
4.6.4 對錯誤數據的約束
4.6.5 ENUM和SET約束
4.6.6 觸發器與約束
4.6.7 外鍵約束
4.7 視圖
4.7.1 視圖的作用
4.7.2 物化視圖
4.8 分區錶
4.8.1 分區概述
4.8.2 分區類型
4.8.3 子分區
4.8.4 分區中的NULL值
4.8.5 分區和性能
4.8.6 在錶和分區間交換數據
4.9 小結
第5章 索引與算法
5.1 InnoDB存儲引擎索引概述
5.2 數據結構與算法
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統計
5.6 B+樹索引的使用
5.6.1 不同應用中B+樹索引的使用
5.6.2 聯閤索引
5.6.3 覆蓋索引
5.6.4 優化器選擇不使用索引的情況
5.6.5 索引提示
5.6.6 Multi-Range Read優化
5.6.7 Index Condition Pushdown(ICP)優化
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 小結
第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 小結
第7章 事務
7.1 認識事務
7.1.1 概述
7.1.2 分類
7.2 事務的實現
7.2.1 redo
7.2.2 undo
7.2.3 purge
7.2.4 group commit
7.3 事務控製語句
7.4 隱式提交的SQL語句
7.5 對於事務操作的統計
7.6 事務的隔離級彆
7.7 分布式事務
7.7.1 MySQL數據庫分布式事務
7.7.2 內部XA事務
7.8 不好的事務習慣
7.8.1 在循環中提交
7.8.2 使用自動提交
7.8.3 使用自動迴滾
7.9 長事務
7.10 小結
第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實現增量備份
8.6 快照備份
8.7 復製
8.7.1 復製的工作原理
8.7.2 快照+復製的備份架構
8.8 小結
第9章 性能調優
9.1 選擇閤適的CPU
9.2 內存的重要性
9.3 硬盤對數據庫性能的影響
9.3.1 傳統機械硬盤
9.3.2 固態硬盤
9.4 閤理地設置RAID
9.4.1 RAID類型
9.4.2 RAID Write Back功能
9.4.3 RAID配置工具
9.5 操作係統的選擇
9.6 不同的文件係統對數據庫性能的影響
9.7 選擇閤適的基準測試工具
9.7.1 sysbench
9.7.2 mysql-tpcc
9.8 小結
第10章 InnoDB存儲引擎源代碼的編譯和調試
10.1 獲取InnoDB存儲引擎源代碼
10.2 InnoDB源代碼結構
10.3 MySQL 5.1版本編譯和調試InnoDB源代碼
10.3.1 Windows下的調試
10.3.2 Linux下的調試
10.4 cmake方式編譯和調試InnoDB存儲引擎
10.5 小結
前言/序言
為什麼要寫這本書
過去這些年我一直在和各種不同的數據庫打交道,見證瞭MySQL從一個小型的關係型數據庫發展為各大企業的核心數據庫係統的過程,並且參與瞭一些大大小小的項目的開發工作,成功地幫助開發人員構建瞭可靠的、健壯的應用程序。在這個過程中積纍瞭一些經驗,正是這些不斷纍積的經驗賦予瞭我靈感,於是有瞭這本書。這本書實際上反映瞭這些年來我做瞭哪些事情,其中匯集瞭很多同行每天可能都會遇到的一些問題,並給齣瞭解決方案。
MySQL數據庫獨有的插件式存儲引擎架構使其和其他任何數據庫都不同。不同的存儲引擎有著完全不同的功能,而InnoDB存儲引擎的存在使得MySQL躍入瞭企業級數據庫領域。本書完整地講解瞭InnoDB存儲引擎中最重要的一些內容,即InnoDB的體係結構和工作原理,並結閤InnoDB的源代碼講解瞭它的內部實現機製。
本書不僅講述瞭InnoDB存儲引擎的諸多功能和特性,還闡述瞭如何正確地使用這些功能和特性,更重要的是,還嘗試瞭教我們如何Think Different。Think Different是20世紀90年代蘋果公司在其曠日持久的宣傳活動中提齣的一個口號,藉此來重振公司的品牌,更重要的是,這個口號改變瞭人們對技術在日常生活中的作用的看法。需要注意的是,蘋果的口號不是Think Differently,是Think Different,Different在這裏做名詞,意味該思考些什麼。
很多DBA和開發人員都相信某些“神話”,然而這些“神話”往往都是錯誤的。無論計算機技術發展的速度變得多快,數據庫的使用變得多麼簡單,任何時候Why都比What重要。隻有真正理解瞭內部實現原理、體係結構,纔能更好地去使用。這正是人類正確思考問題的原則。因此,對於當前齣現的技術,盡管學習其應用很重要,但更重要的是,應當正確地理解和使用這些技術。
關於本書,我的頭腦裏有很多個目標,但最重要的是想告訴大傢如下幾個簡單的觀點:
·不要相信任何的“神話”,學會自己思考;
·不要墨守成規,大部分人都知道的事情可能是錯誤的;
·不要相信網上的傳言,去測試,根據自己的實踐做齣決定;
·花時間充分地思考,敢於提齣質疑。
當前有關MySQL的書籍大部分都集中在教讀者如何使用MySQL,例如SQL語句的使用、復製的搭建的、數據的切分等。沒錯,這對快速掌握和使用MySQL數據庫非常有好處,但是真正的數據庫工作者需要瞭解的不僅僅是應用,更多的是內部的具體實現。
MySQL數據庫獨有的插件式存儲引擎使得想要在一本書內完整地講解各個存儲引擎變得十分睏難,有的書可能偏重對MyISAM的介紹,有的可能偏重對InnoDB存儲引擎的介紹。對於初級的DBA來說,這可能會使他們的理解變得更睏難。對於大多數MySQL DBA和開發人員來說,他們往往更希望瞭解作為MySQL企業級數據庫應用的第一存儲引擎的InnoDB,我想在本書中,他們完全可以找到他們希望瞭解的內容。
再強調一遍,任何時候Why都比What重要,本書從源代碼的角度對InnoDB的存儲引擎的整個體係架構的各個組成部分進行瞭係統的分析和講解,剖析瞭InnoDB存儲引擎的核心實現和工作機製,相信這在其他書中是很難找到的。
第1版與第2版的區彆
本書是第2版,在寫作中吸收瞭讀者對上一版內容的許多意見和建議,同時對於最新MySQL 5.6中許多關於InnoDB存儲引擎的部分進行瞭詳細的解析與介紹。希望通過這些改進,給讀者一個從應用到設計再到實現的完整理解,彌補上一版中深度有餘,內容層次不夠豐富、分析手法單一等諸多不足。
較第1版而言,第2版的改動非常大,基本上重寫瞭50%的內容。其主要體現在以下幾個方麵,希望讀者能夠在閱讀中體會到。
·本書增加瞭對最新MySQL 5.6中的InnoDB存儲引擎特性的介紹。MySQL 5.6版本是有史以來最大的一次更新,InnoDB存儲引擎更是添加瞭許多功能,如多綫程清理綫程、全文索引、在綫索引添加、獨立迴滾段、非遞歸死鎖檢測、新的刷新算法、新的元數據錶等。讀者通過本書可以知道如何使用這些特性、新特性存在的局限性,並明白新功能與老版本InnoDB存儲引擎之間實現的區彆,從而在實際應用中充分利用這些特性。
·根據讀者的要求對於InnoDB存儲引擎的redo日誌和undo日誌進行瞭詳細的分析。讀者應該能更好地理解InnoDB存儲引擎事務的實現。在undo日誌分析中,通過InnoSQL自帶的元數據錶,用戶終於可對undo日誌進行統計和分析,極大提高瞭DBA對於InnoDB存儲引擎內部的認知。
·對第6章進行大幅度的重寫,讀者可以更好地理解InnoDB存儲引擎特有的next-key locking算法,並且通過分析鎖的實現來瞭解死鎖可能産生的情況,以及InnoDB存儲引擎內部是如何來避免死鎖問題的産生的。
·根據讀者的反饋,對InnoDB存儲引擎的insert buffer模塊實現進行瞭更為詳細的介紹,讀者可以瞭解其使用方法以及其內部的實現原理。此外還增加瞭對insert buffer的升級版本功能——change buffer的介紹。
讀者對象
本書不是一本麵嚮應用的數據庫類書籍,也不是一本參考手冊,更不會教你如何在MySQL中使用SQL語句。本書麵嚮那些使用MySQL InnoDB存儲引擎作為數據庫後端開發應用程序的開發者和有一定經驗的MySQL DBA。書中的大部分例子都是用SQL語句來展示關鍵特性的,如果想通過本書來瞭解如何啓動MySQL、如何配置Replication環境,可能並不能如願。不過,在本書中,你將知道InnoDB存儲引擎是如何工作的,它的關鍵特性的功能和作用是什麼,以及如何正確配置和使用這些特性。
如果你想更好地使用InnoDB存儲引擎,如果你想讓你的數據庫應用獲得更好的性能,就請閱讀本書。從某種程度上講,技術經理或總監也要非常瞭解數據庫,要知道數據庫對於企業的重要性。如果技術經理或總監想安排員工參加MySQL數據庫技術方麵的培訓,完全可以利用本書來“充電”,相信你一定不會失望的。
要想更好地學習本書的內容,要求具備以下條件:
·掌握SQL。
·掌握基本的MySQL操作。
·接觸過一些高級語言,如C、C++、Python或Java。
·對一些基本算法有所瞭解,因為本書會分析InnoDB存儲引擎的部分源代碼,如果你能看懂這些算法,這會對你的理解非常有幫助。
如何閱讀本書
本書一共有10章,每一章都像一本“迷你書”,可以單獨成冊,也就說你完全可以從書中任何一章開始閱讀。例如,要瞭解第10章中的InnoDB源代碼編譯和調試的知識,就不必先去閱讀第3章有關文件的知識。當然,如果你不太確定自己是否已經對本書所涉及的內容完全掌握瞭,建議你係統性地閱讀本書。
本書不是一本入門書籍,不會一步步引導你去如何操作。倘若你尚不瞭解InnoDB存儲引擎,本書對你來說可能就顯得沉重一些,建議你先查閱官方的API文檔,大緻掌握InnoDB的基礎知識,然後再來學習本書,相信你會領略到不同的風景。
為瞭便於大傢閱讀,本書在提供源代碼下載的同時也將源代碼附在瞭書中,因此占去瞭一些篇幅,還請大傢理解。
緻謝
在編寫本書的過程中,我得到瞭很多朋友的熱心幫助。首先要感謝Pecona公司的CEO Peter Zaitsev和CTO Vadim Tkachenko,通過和他們的不斷交流,使我對InnoDB存儲引擎有瞭更進一步的瞭解,同時知道瞭怎樣纔能正確地將InnoDB存儲引擎的補丁應用到生産環境。
其次,要感謝網易公司的各位同事們,能在纔華橫溢、充滿創意的團隊中工作我感到非常榮幸和興奮。也因為在這個開放的工作環境中,我可以不斷進行研究和創新。
此外,我還要感謝我的母親,寫本書不是一件容易的事,特彆是這本書還想傳達一些思想,在這個過程中我遇到瞭很多的睏難,感謝她在這個過程中給予我的支持和鼓勵。
最後,一份特彆的感謝要送給本書的策劃編輯楊福川和薑影,他們使得本書變得生動和更具有靈魂。此外還要感謝齣版社的其他默默工作的同事們。
薑承堯
MySQL技術內幕:InnoDB存儲引擎(第2版) epub pdf mobi txt 電子書 下載 2024
MySQL技術內幕:InnoDB存儲引擎(第2版) 下載 epub mobi pdf txt 電子書