程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 《MySQL核心內幕》

《MySQL核心內幕》

編輯:MySQL綜合教程

 

【內容簡介】

本書由Sun中國工程院的MySQL專家講解MySQL內核設計和實現。作者對MySQL分而治之,將復雜的MySQL內核劃分成多個功能子系統,從而化解了理解子系統的各個難點。
本書共分12章。第1章介紹MySQL的歷史淵源。第2章介紹MySQL數據庫的架構。第3章深入了解MySQL源代碼,第4章解釋關鍵的類和算法。從第5章開始直到最後,按各子系統進行講解,內容包括連接和網絡系統、服務器線程和資源管理、查詢解析與優化器、安全管理系統、存儲引擎接口詳解與實踐、經典存儲引擎、日志功能及實踐分析和其他子系統。
配書光盤中提供了相關的MySQL源代碼。
本書適合對內核編程設計感興趣的技術人員和開發者以及在學習、工作中使用MySQL數據庫的各類技術人員閱讀。由於主要內容均涉及到MySQL內核源代碼,所以學習者應當具備C/C++預備知識。    

【基本信息】

  • 作者: 祝定澤    張海    黃建昌   
  • 出版社:清華大學出版社

【作譯者】

作者: 張海
張海,SUN系統工程師(SCSA,SCNA),MySQL DBA(CMDBA),現就職於一家巴基斯坦的軟件公司,負責北京辦公室的系統網絡以及數據庫的整體運維,同時也為LAHORE總部提供項目支持。.

作者: 黃健昌
黃健昌:擁有10年以上軟件的研發和項目管理工作經驗。2005-2009在Sun 公司工作,擔任 ISV Engineering 部門技術顧問,主要負責電信行業合作伙伴的軟件技術咨詢,在Java, Solaris, MySQL 應用研發及性能優化方面有技術專長。現就職於IBM。

作者: 祝定澤
祝定澤:英文名“Hironics”,常用網名也為此。 Sun MySQL架構師,一致關注MySQL的在國內的成長與應用。幾位作者共同運維MySQL技術網站http://www.mysqlsystems.com,Hironics經常供稿於InfoQ。Hironics擁有MySQL的全部認證:CMA、CMDEV、CMDBA和CMCDBA。

【目錄】

第1章 MySQL的前世今生. 1
1.1 MySQL的歷史 2
1.2 存儲引擎 4
1.3 MySQL市場 6
1.4 後話 8
第2章 數據庫系統的立體視圖 9
2.1 數據庫系統架構 10
2.2 數據庫系統的分類 10
2.2.1 面向對象型數據庫 10
2.2.2 關系型數據庫 13
2.2.3 對象關系型數據庫 14
2.3 關系型數據庫系統架構 15
2.3.1 客戶端應用程序 16
2.3.2 查詢接口 16
2.3.3 查詢語句處理 17
2.3.4 查詢優化 18
2.3.5 語句執行 19
2.3.6 讀寫文件 19
2.3.7 模塊協作 19
2.3.8 RDBMS的層次結構 20
.2.4 MySQL數據庫系統 21
2.4.1 MySQL數據庫系統架構 22
2.4.2 子系統之間的聯系 23
2.4.3 MySQL子系統和代碼 25
2.5 小結 29
第3章 暢游源代碼 31
3.1 下載MySQL源代碼 32
3.1.1 Bazaar安裝 32
3.1.2 訪問MySQL源代碼 33
3.2 源代碼目錄結構 35
3.2.1 主要關鍵目錄 36
3.2.2 開源社區貢獻的代碼 42
3.2.3 解讀sql/sql_delete.cc 43
3.3 MySQL內核分析工具 46
3.3.1 編譯和安裝MySQL 48
3.3.2 調試MySQL 50
3.3.3 源代碼檢索工具 56
3.3.4 Doxyen分析源代碼 57
3.4 小結 58
第4章 核心類、庫函數和算法 59
4.1 核心類 61
4.1.1 線程類(THD) 61
4.1.2 Item類 65
4.1.3 表描述類- TABLE 68
4.1.4 FIELD類 69
4.2 函數庫 72
4.2.1 內存操作函數 73
4.2.2 文件系統操作函數 74
4.2.3 哈希表操作 76
4.2.4 字符串操作 77
4.2.5 宏定義 78
4.3 核心算法 78
4.3.1 Bitmaps –位圖 79
4.3.2 表連接緩沖工作原理 80
4.3.3 MySQL排序實現 83
4.3.4 字符集和校對規則 86
4.4 小結 88
第5章 連接和網絡系統 89
5.1 MySQL NET協議 90
5.1.1 協議和操作系統協議棧 90
5.2 網絡包格式 92
5.2.1 Null結尾字符串和
帶長度標識字符串 93
5.2.2 網絡包頭部格式 94
5.3 客戶端發送的包 95
5.3.1 客戶端認證包 95
5.3.2 命令包(Command) 96
5.4 服務器端發送的包 99
5.4.1 握手初始化包 99
5.4.2 結果包分類 102
5.4.3 OK包 102
5.4.4 ERROR包 105
5.4.5 結果集包 107
5.5 小結 114
第6章 服務器線程和資源管理 117
6.1 線程還是進程 118
6.1.1 線程與進程的比較 119
6.2 MySQL線程問題和解決方案 120
6.2.1 標准C函數調用 121
6.2.2 互斥鎖 122
6.2.3 線程同步 124
6.3 客戶端請求的處理 126
6.3.1 MySQL的啟動過程 127
6.3.2 執行流 128
6.4 類、API、變量和結構體 130
6.5 MySQL內存分配 132
6.5.1 內存共享塊 132
6.5.2 線程內存區域(TMA) 133
6.5.3 MySQL如何實現內存分配 134
6.6 小結 137
第7章 查詢解析與優化器 139
7.1 MySQL解析器 140
7.1.1 詞法分析程序.. 143
7.1.2 語法分析器 146
7.1.3 幾個關鍵類 146
7.2 查詢優化器 154
7.2.1 傳統優化算法 154
7.2.2 MySQL的查詢算法 155
7.3 小結 170
第8章 安全管理系統 171
8.1 賬號認證 172
8.1.1 賬號定義 172
8.1.2 身份審核 173
8.1.3 具體優先原則 182
8.2 權限控制 183
8.2.1 系統權限表 184
8.2.2 權限審核 186
8.2.3 權限級別 189
8.3 安全部署 193
8.3.1 服務器系統安全 194
8.3.2 數據庫系統安全 194
8.4 小結 198
第9章 存儲引擎接口詳解與實踐 199
9.1 MySQL插件式存儲引擎體系結構 200
9.1.1 基本流程 200
9.1.2 從源代碼文件開始 201
9.1.3 意想不到的幫助 201
9.1.4 Handlerton 202
9.1.5 Handler類 204
9.1.6 Archive存儲引擎的
簡單分析 208
9.2 開發我的存儲引擎——
Lillian(模板剖析) 209
9.2.1 底層I/O類 209
9.2.2 Lillian_data類 209
9.2.3 Lillian_index類 217
9.3 開發我的存儲引擎——
Lillian(代碼編寫) 232
9.3.1 階段一:初始化存儲引擎 232
9.3.2 階段二:表操作 238
9.3.3 階段三:讀寫數據 243
9.3.4 階段四:修改、刪除數據 245
9.3.5 階段五:索引功能 248
9.4 小結 261
第10章 存儲引擎 263
10.1 MySQL元數據文件——frm 264
10.2 MyISAM存儲引擎 270
10.2.1 MyISAM的架構 270
10.2.2 數據文件(.MYD) 271
10.2.3 索引文件(.MYI) 277
10.3 InnoDB存儲引擎 288
10.3.1 InnoDB的宗旨和
主要功能特性 288
10.3.2 InnoDB的架構和
代碼布局 288
10.3.3 InnoDB 文件格式 291
10.3.4 InnoDB 記錄結構 292
10.3.5 InnoDB頁結構 296
10.4 小結 300
第11章 MySQL日志功能及實現分析 301
11.1 錯誤日志 302
11.1.1 錯誤日志功能介紹 302
11.1.2 錯誤日志初始化 303
11.1.3 錯誤日志的記錄實現 305
11.2 普通日志 307
11.2.1 普通日志功能介紹 307
11.2.2 普通日志的初始化 310
11.2.3 普通日志記錄功能實現 311
11.3 慢查詢日志 312
11.3.1 慢查詢日志功能概述 312
11.3.2 慢查詢日志的初始化 313
11.3.3 慢查詢日志的實現 314
11.4 二進制日志 317
11.4.1 二進制日志功能介紹 317
11.4.2 二進制日志的初始化 320
11.4.3 二進制日志的實現 321
11.5 小結 322
第12章 其他子系統 323
12.1 復制功能(Replication)子系統 324
12.1.1 Replication基礎架構
描述 324
12.1.2 Replication實現原理
簡述 325
12.1.3 Replication復制線程 326
12.1.4 Replication功能文件 326
12.1.5 Replication子系統組成 327
12.1.6 Replication原理剖析 327
12.1.7 小結 342
12.2 錯誤消息子系統 342
12.2.1 錯誤消息的實現原理 342
12.2.2 錯誤消息的一致性 344
12.2.3 不同版本下錯誤消息的添加方法 345
12.2.4 小結 345
附錄一 Bazaar入門指南 347
附錄二 MySQL源碼分布縱覽 354
參考文獻... 371

【前言】

寫作背景.
不知不覺涉足MySQL已經幾個年頭了,與其他有志於此的朋友一樣,我也經歷了學習——應用——關注——再學習的過程。也就是說,我也是從漫無邊際到茫然無措,再到初窺門徑,轉而覺得心有戚戚焉這一路走下來的。再幸得公司提供學習、實踐MySQL的機會和環境,其中甘苦,猶然在心。
在我剛開始產生把自己的MySQL經驗集結成冊、撰寫成書的念頭時,我思緒萬千,不知道該從何下手。我實在不想落入MySQL傳統書籍的窠臼,照貓畫虎地再寫這麼一本。不錯,前人著述備矣,但我既然要寫,就要寫出點與眾不同的東西來,我的書該如何定位,說實話,這確實讓人頗費思量。
縱觀書海,有關MySQL的書籍大多止步於數據庫管理、數據庫應用,至此尚沒有深入討論其原理和內核的資料。靈感終於浮現出來,我意識到自己可以從一個全新的視角看待MySQL。開發內核並不是我的工作,但研究內核卻是我的嗜好。這些年來,我不斷搜集與內核有關的奇聞轶事,包括Linux、Solaris和MySQL的。依靠這些日積月累的材料,我可以寫一本內核學習的書籍。本質上,這本書是描述MySQL內核是如何設計和實現的,所提供的信息傾向於實用。通過本書,你就可以做一些數據庫內核開發的工作了,甚至定制你需要的數據庫。做IT的人一般都似乎注重實效的,因此,這是一本偏重實踐的書,它應當是有趣、易讀而且有幫助的。
我希望讀者可以從這本書中領略到更多MySQL內核的精妙之處,包括寫出來的和沒寫出來的,也希望讀者能從閱讀本書和讀內核代碼開始跨越到開始嘗試改進快速發展的MySQL內核代碼。如果你僅僅是興致所至,讀書自娛,那也希望你能從中找到樂趣。當然如果你需要一本帶有“內核”或“核心”字樣的書擺在書櫃上以顯示你的卓越技術和資深地位,這也是個不錯的選擇。
不管你學習MySQL的目的是什麼,我都衷心地希望你能喜歡我的書。
本書結構
本書共分成十二章。
第一章我們從MySQL的歷史淵源說開去,談論其大是大非。第二章的數據庫理論雖看似空洞外加一點索然無味,但實踐終究皈依於理論。正所謂勿在浮沙築高台。
第三章開始我們深入MySQL原汁原味的源代碼,並在第四章中解釋了關鍵的類和算法,使得讀者面對茫茫code海可以運籌帷幄,處亂不驚。
從第五章開始直到最後,我們將按各子系統進行排兵布陣。從第五章的網絡子系統到第十二章的復制子系統,讀者可以章章為營。這些章節中,最值得讀者細細品味的是第九章。第九章中我們和讀者一起動手編寫自己的MySQL存儲引擎Lillian。..
全書的第八、十二章及附錄一、二由張海編著,黃健昌在百忙之中編寫了第十一章,其他章節由我完成。
閱讀對象
我們相信這本書將為學習、工作中使用MySQL數據庫的各類技術人員提供非常有用的參考。
應用程序開發者能夠在這本書中找到JDBC、ODBC後面的MySQL數據庫如何實現信息的存儲和讀取。這些信息能幫助開發人員在開發前台應用程序時,理解每次數據調用的性能、影響和實現細節。資源管理、網絡和通信、查詢解析優化等對這類讀者來說是最有用的章節。
項目管理人員和系統分析師可以學到主要MySQL子系統的行為特征,了解MySQL的長處以及短處。在系統設計時,可為更好地選擇合適的數據庫提供參考。
技術支持人員、咨詢師和DBA將發現大量關於MySQL實現細節的信息。每一章提供的源碼解析和數據結構可幫助調試、優化和操作MySQL數據庫。
如果只是剛剛入門的MySQL用戶,可在開頭幾章找到總體上的框架概述,會有一種一覽眾山小的感覺。又可以通過後面章節的學習實踐加深對MySQL的認識。
除了技術社區的用戶之外,在學校裡面研究數據庫系統的人員將發現本書是很好的參考,做到理論結合實際。MySQL數據庫是一個高可用、速度快且使用面廣的數據庫系統,隨著MySQL 5.4版本的推出,適用於不同的工作負載,從單處理器台式機到具有大量內存和CPU線程的SMP系統。MySQL數據庫為商業數據處理、Web服務和電信系統提供的Cluster 7.0高可用性和可擴展性是業內首屈一指的。研究這一數據庫系統可以學到很多知識。
相關材料和光盤
.作為本書的補充,讀者可以在我們的網站(http://www.mysqlsystems.com)找到最新的內容,包括更新的材料、我們使用的工具以及相關培訓的文檔。我們會定期更新網站,及時反饋MySQL在內核方面的更新和信息。此外,網站還有關於這本書的論壇(http://forum.mysqlsystems.com),讀者可與本書的作者就書本上的話題進行互動。
另外讀者還可以在本書贈送的光盤中找到書中所使用的軟件和代碼。
工具和平台
操作系統
需要指出的一點是本書的幾位作者習慣使用的操作系統各有不同,分別為OpenSolaris,Linux和Windows XP。因此在本書的不同章節中,讀者會看到我們使用各種操作系統的工具來查看或編輯源代碼。幸運的是,大部分情況下,操作系統的不同並不影響讀者對本書的閱讀和理解。在沒有特別指明的情況下,我們使用Linux來演示,因為我們推測本書的大部分讀者在工作、學習中廣泛使用Linux。
MySQL源代碼
寫作IT書籍的人總是面臨一個共同的問題——書還未出版,內容已經陳舊了。在比較了MySQL所有版本代碼的情況下,我們認為MySQL 5.1的代碼最完整、最真實的反應了MySQL的現實情況。5.4和6.0中並沒有對源代碼架構和布局進行大量的更改。雖然6.0中加入了Falcon等存儲引擎,但主線和5.1還是一致的。5.4的優化,目前來看還是主要針對InnoDB存儲引擎實施的,並未改變現有系統整體架構,因此在這裡不予以過多關注。
在本書中,雖然我們采用MySQL 5.1作為示范,但並不限於該版本。有重大意義的6.0或5.4版本的更新,我們也會反應在本書中,並會在引用時特別注明。
作者的話
MySQL為人稱道的莫過於它的自由精神,所有源代碼唾手可得。侯捷先生雲:“源碼在前,了無秘密”。是的,但我們在面對它的時候,為什麼卻總是因為這種規模和層面所造就的陡峭學習曲線陷入困頓呢?很多朋友就此倒下,縱然數據庫世界繁花似錦,縱然MySQL內核天空無邊廣闊。但是,眼前的迷霧重重,心中的陰霾又怎能被陽光驅散呢?縱有雄心壯志,拔劍四顧心茫然,但腳下路在何方?
MySQL內核學習並不容易,它之所以難學,在於龐大的規模和復雜的層面。規模一大,就不易現出本來面目,渾然一體,自然不容易找到著手之處;層面一多,就會讓人眼花缭亂,盤根錯節,怎能讓人提綱挈領?
本書從整體出發,讓讀者對MySQL內核的各個核心子系統有個整體把握,包括它們提供什麼樣的服務,為什麼要提供這樣的服務,又是如何實現的。而且,本書還包含了MySQL內核開發者在開發時需要用到的很多信息,包括調試技術、注意事項等等。在消化這本書的基礎上,如果你側重於了解內核,可以進一步研究和源代碼本身。
做好准備,開始你的內核之旅吧!
致謝
曾經無法理解每本書為何都要在前言出現類似 “感激”或“感謝”之言。從寫作此書的幾個月裡,我被許多人的真誠幫助深深感動,終得感觸——原來這才是最應該寫的部分。
我要感謝為本書的完成付出了心血的老板們- Mike和Gary,以及同事Sarah。還有在技術上審閱了此書的劉文生、張文龍、顧永純、王強、Hunter。
我還要感謝所有花時間閱讀本書、碰過面和沒碰過面的同事和朋友。他們是為本書作序的Sun ERI院長Kevin Song、身處日本的Sun亞太區首席MySQL顧問Kajiyama和CSDN總經理韓磊,屠殺100個錯別字的李凱,作圖高手周林志,修改內容的老同學韓小梅,深夜給我講述MySQL歷史的Monty。
特別感謝清華出版社的編輯栾大成和其他工作人員。
最重要的是,感謝Lillian對我默默的支持,這也是我命名自己編寫的存儲引擎為Lillian的原因所在。...

【序言】

序(一)
得知ISVE組的兩個人正在寫MySQL內核方面的書時,感覺很驚訝。的確,Sun中國工程研究院的人寫書揭示軟件內核,是——件非常值得注意的事情。
幾年前,我們已對MySQL的發展有所關注。從Sun收購MySQL至今,MySQL仍然是最受歡迎的開源數據庫軟件。開源、免費的MySQL,讓你可以用近乎零成本建立容量巨大的數據庫或者網上交易系統,再加上Sun和無數社區精英的技術支持,不風靡都很難!
但這些年來,MySQL中文資料較為匮乏,基本上處在初、中級的水准,缺乏足夠的深度。人們對該軟件往往知其然而不知其所以然。這導致了在中國MySQL數據庫高級人才相對較少。
《MySQL核心內幕》這本書是研究MySQL內核的絕佳指導資料,真正做到了“授人以漁”。
打開MySQL的源代碼稍作觀察,便可發現其規模之大,有如阿房宮——“覆壓三百余裡,隔離天日”;其關系錯綜復雜,可謂“廊腰缦回,檐牙高啄,各抱地勢,勾心斗角”。這無疑給想深入理解MySQL的人士出了一個難題。
在《MySQL核心內幕》這本書中,作者將MySQL分而治之,將復雜的MySQL內核瞬間瓦解成多個功能子系統。每一章中,作者抽絲剝繭,化解理解子系統的各個難點。所以,你面對的不再僅僅是赤裸裸的代碼,而是真正能雅俗共賞的設計藝術。
在讀書的同時,一定要親身實踐:理解內核某部分的捷徑就是對它做出修改,這樣才能越過代碼本身看到內核的深層機理。讀者帶著一份耐心、一份執著,闖過一道道難關,直到閱讀完本書的最後一章時,會有“蓦然回首,那人卻在燈火闌珊處”的欣喜感覺!
相信在本書的帶領下,中文地區MySQL用戶和支持者的水平能夠更上一層樓。
Kevin Song
Sun中國工程院院長
序(二)
MySQL在業界被譽為世界上最流行的開源數據庫,它提供了節省成本的數據庫管理系統的可行性新方案。
MySQL有許多好處,不僅價格具有競爭力,而且其作為“開源”的領導者,做到了代碼全開放;並提供了專業的“企業級隨機應變”能力。MySQL的開源可用性讓所有用戶和工程師們能夠在代碼級了解架構和行為。
Sun收購MySQL的開源業務,提供了經驗豐富的技術支持工程師,以此可以保障為客戶提供高品質的服務。
要了解源代碼級的全部細節和優點,工程師們應當明確MySQL內核的基本原理。有祝定澤這樣一位訓練有素的MySQL專家幫助工程師和讀者了解MySQL的哲學和設計,我相信這本書定能實現這樣的任務。讓我們在丌源的闩山世界中快樂徜徉。
預祝取得成功!
亞太區首席MySQL顧問
梶山 隆輔

【媒體評論】

當初聽說ISVE組的兩個人正在寫MySQL內核方面的書,感覺非常詫異。不曾想SUN中國工程研究院的人也有心寫內核方面的書。 如今當這本書完整的展現在我面前時,我確定他們不是在開玩笑。但這些年來,MySQL中文資料較為匮乏,基本處在初、中級的水准,缺乏足夠的深度。人們往往知其然而不知其所以然。這導致了在中國 MySQL 數據庫 高級人才相對較少。《MySQL核心內幕》這本書是研究MySQL內核的絕佳指導資料,真正做到了“授人以漁”。.
Kevin Song--Sun中國工程院院長

MySQL在業界被譽為世界上最流行的開源數據庫,它提供了成本核算的數據庫管理系統的可行性新方案。Sun收購MySQL的開源業務通過給客戶提供高品質的服務提供經驗豐富的技術支持工程師。要了解源代碼水平的全部細節和好處,工程師們要了解MySQL內核的基本原理 。我相信這本書完成了這項任務,祝定澤,一個有成就的MySQL專家,幫助工程師和讀者了解MySQL的哲學和設計。享受開放源碼的自由世界。 讓我們慶祝這種可能性!
亞太區首席MySQL顧問..
梶山 隆輔

作為一名開發人員,不應該只限於使用工具,而應該去了解其原理及本質。了解一個工具原理最好的方法莫過於從源代碼著手。《MySQL 核心內幕》為想要了解MySQL核心機理的國內開發人員打開了一扇門,作者通過理論、實踐相結合,對系統架構及核心代碼進行了詳盡的闡述,本書對於熱愛MySQL開源軟件,同時喜歡刨根問底的技術人員是一本必看的好書。
--金融界架構師 王志剛

《MySQL 核心內幕》是國內第一本解析MySQL源代碼的著作,深刻揭示了 MySQL的內部機理、闡述了MySQL各子系統的關聯、並實例編寫了自定義存儲引擎,相信從事MySQL相關工作的技術人員可從中受益。
---百度高級DBA 吳詩展

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved