序
※ 為什麼要寫作本書
作為一名智商平平的程式設計師,在日常學習過程中經常會遇到兩種很尷尬的情況:
■ 學習資料極其晦澀,看起來都是些高大上的知識,看著看著就睏瞭;
■ 很多通俗易懂的資料感覺就是小兒科,看完瞭跟沒看差不多。
而廣大的讀者其實需要經歷一個由淺入深的平緩學習麯線,並且這個學習的過程不至於特別地無聊。我靈機一動,這天底下和我一樣的同學肯定有很多很多,如果我能把那些晦澀難懂的知識按照尊重學習者認知規律的方式錶達齣來,那豈不是一件極其有意義的事情嗎? 畢竟我一個人敲程式創造的價值和讓成韆上方的人快速、友善地學會一門專業知識所創造的價值是遠遠不能比的。當然,這是一個美好的想法,做這個事情是需要投入巨大的精力的。於是我辭掉瞭工作,放棄瞭週末,決心花上幾年時間來做這件能讓我「天天打雞血」的工作。
寫作本書的時間主要花在瞭以下這兩個方麵:
自己搞清楚MySQL 到底是怎樣運行的,這個過程就是不斷地研究原始程式,參考各種書籍和資料;思考如何把我已經知道的知識錶達齣來。這個過程就是我不停地在地上走過來走過去,梳理知識結構,斟酌用詞用句,不停地將已經寫好的文章推倒重來,隻是想給大傢一個不錯的使用者體驗。這兩個方麵用的時間基本上是各佔一半。
※ 本書有什麼特色
這並不是一本傳統意義上的技術圖書,大緻有以下特點。
■ 全文用白話寫成,而且有的地方在閒聊,就像是有個人在跟同學們囉嗦一樣,希望各位看起來別想睡覺。
■ 從初學者的角度齣發,嘗試避免用一個沒學過的概念去介紹另一個新概念。
■ 語言在圖片麵前一直都是很蒼白的,所以我畫瞭很多圖,各位慢慢看。
■ 魔鬼藏在細節中。以往很多同學在讀書的時候感到睏惑,是因為細節列齣的不夠多,導緻大傢瞎猜。
■ 層層鋪陳的結構劃分。本書覆蓋的內容形成瞭一個閉環,希望大傢在讀完書後能有一種看完瞭一個完整的故事的感覺。
■ 等等等等,我一時想不起來瞭。
※ 本書寫瞭什麼
雖然本書在某些方麵看起來不是那麼嚴肅,但是的確是一本專業技術圖書,緻力於覆蓋大傢工作和麵試過程中最常遇到的一些關於 MySQL 的核心概念。
本書共劃分為4 個部分,各部分簡介如下。
第1 部分( 第1 章~ 第3 章):以隻會寫增刪改查敘述的小白身份重新檢查MySQL 到底是個什麼東西,介紹 MySQL 的伺服器程式和用戶端程式有哪些、啟動選項和係統變數以及字元集的一些事情。
第2 部分( 第4 章~ 第9 章):嘮叨記錄、頁麵、索引、錶格空間的結構和用法。第2 部分是全篇的基礎,後麵的章節都依賴於這些結構。
第3 部分( 第10 章~ 第17 章):介紹同學們工作中經常遇到的查詢最佳化問題,比如單錶查詢是如何執行的,連接查詢是怎麼執行的,基於成本和規則的最佳化是個什麼東西。本部分還十分詳細地介紹如何查看EXPLAIN 敘述的執行結果。
第4 部分( 第18 章~ 第22 章):介紹為什麼會有交易的概念,以及 MySQL是如何實現交易的,其中包括 redo 日誌、undo 日誌、MvCC、各種鎖的細節等。
寫作本書時參考的MySQL 原始程式版本是 5.7.22,不過書中的絕大部分知識和MysQL 的版本沒有什麼特別大的關係,在某些與特定版本相關的地方我也有明顯的強調。
※ 本書適閤讀者群
大傢需要注意的是,本書並不是一本資料庫入門圖書,因此大傢需要知道增刪改查是啥意思,並且能用SQL 敘述寫齣來。當然並不要求各位知道得太多,甚至不知道連接的語法都可以。另外,讀者應該掌握一些電腦基礎知識,比方說什麼是位元、什麼是位元組、什麼是進位轉換等。
本書大緻適閤下麵的這些讀者來閱讀:
■ 剛剛學完 SQL 基礎的同學;
■ 被資料庫問題摺磨的求職者;
■ 天天被 DBA 逼著最佳化 SQL 的業務開發朋友;
■ 菜鳥 DBA 和不是非常菜的 DBA 朋友;
■ 對 MySQL 核心有強烈興趣但一看原始程式就發呆的朋友。
※ 一個很有用的工具
本書會涉及很多 InnoDB 的儲存結構的知識,比如記錄結構、頁結構、索引結構、錶格空間結構等。這些知識是所有後續知識的基礎,所以是重中之重,大傢需要認真對待。Jeremy Cole 己經使用 Ruby 開發瞭一個解析這些儲存結構的工具,在 GitHub 上的地址是 github.com/jeremycole/innodb_ruby。
大傢可以按照說明安裝這個工具,以便更進一步地瞭解 InnoDB 中的一些儲存結構( 此工具雖然是針對MySQL 5.6 的,但是幸好 MySQL 的基礎儲存結構基本沒有多大變化,所以這個 innodb_ruby 工具在大部分場景下還是可以使用的)。
※ 關於書中的錯誤
由於這是一本專業的技術圖書,而本人的技術水準實在有限,在寫作本書時絕對可以用如履薄冰這個詞來形容。雖然我盡瞭很大努力來保證各個基礎知識的正確性,但還是無法保證所有的觀點都沒有錯誤。如果有哪位同學發現瞭書中的錯誤,請及時到本公司官網service@deepmind.com.tw 和齣版社聯絡,謝謝各位。