會用MySQL不代表你懂,用的熟不代表用的好,用的好不代表用的巧,從根了解MySQL,每一個指令都了然於胸,每一個步驟都輕輕鬆鬆!
使用MySQL的你是否有以下困擾?
●為什麼這個SQL敘述執行得這麼慢?
●為什麼明明建立了索引但查詢計畫顯示沒用?
●為什麼IN查詢中的參數一多就不使用索引了?
●為什麼資料顯示成了亂碼?
每個DBA和後端開發人員在與MySQL打交道時,多少都會遇到許多問題。而索引結構、MVCC、隔離級別的實現、鎖的使用等知識,也是想要進階MySQL必須面對的最佳化問題。
本書針對各種各樣MySQL的問題提出了相應的解答方案。用非主流,非學術派、非理論派的方法說明,但內容絕不打馬虎眼涵蓋了使用MySQL工作中常見的一些核心概念。
★內容精要
本書對MySQL的底層運行原理進行了介紹,內容涵蓋了使用MySQL在工作中常見的一些核心概念。
第1部分介紹了MySQL入門的一些知識,比如MySQL的伺服器程式和用戶端程式有哪些、MySQL的啟動選項和系統變數,以及使用的字元集等。
第2部分是本書後續章節的基礎,介紹了MySQL的一些基礎知識,比如記錄、頁面、索引、表空間的結構和用法等。
第3部分則是經常遇到的查詢優化問題,介紹了單表查詢、連接查詢的執行原理,MySQL基於成本和規則的最佳化具體指什麼,並詳細分析了Explain語句的執行結果。
第4部分則是與MySQL中的事務和鎖相關,介紹了事務概念的來源,MySQL是如何實現事務的,包括redo日誌、undo日誌、MVCC、各種鎖的細節等。
★適合讀者
無論是身居MySQL專家身份的技術人員,還是技術有待進一步提升的DBA,甚至是剛投身於資料庫行業的新手,本書都是徹底瞭解MySQL運行原理的優秀圖書。
作者
小孩子4919
前線上教育公司「跟誰學」後端工程師,公眾號「我們都是小青蛙」作者,喜歡研究原始程式碼,覺得把複雜的問題講清楚是一件很厲害的事情。
目錄
01 裝作自己是個小白--初識MySQL
1.1 MySQL 的用戶端/ 伺服器架構
1.2 MySQL 的安裝
1.3 啟動MySQL 伺服器程式
1.4 啟動MySQL 用戶端程式
1.5 用戶端與伺服器連接的過程
1.6 伺服器處理用戶端請求
1.7 常用儲存引擎
1.8 關於儲存引擎的一些操作
1.9 複習
02 MySQL 的調控按鈕--啟動選項和系統變數
2.1 啟動選項和設定檔
2.2 系統變數
2.3 狀態變數
2.4 複習
03 字元集和比較規則
3.1 字元集和比較規則簡介
3.2 MySQL 中支援的字元集和比較規則
3.3 字元集和比較規則的應用
3.4 複習
04 從一筆記錄說起-- InnoDB記錄儲存結構
4.1 準備工作
4.2 InnoDB 頁簡介
4.3 InnoDB 行格式
4.4 複習
05 盛放記錄的大盒子--InnoDB 資料頁結構
5.1 不同類型的頁簡介
5.2 資料頁結構快覽
5.3 記錄在頁中的儲存
5.4 Page Directory(頁目錄)
5.5 Page Header(頁面表頭)
5.6 File Header(檔案表頭)
5.7 File Trailer(檔案結尾)
5.8 複習
06 快速查詢的秘笈--B+ 樹索引
6.1 沒有索引時進行尋找
6.2 索引
6.3 複習
07 B+ 樹索引的使用
7.1 B+ 樹索引示意圖的簡化
7.2 索引的代價
7.3 應用B+ 樹索引
7.4 回表的代價
7.5 更進一步地創建和使用索引
7.6 複習
08 資料的家-- MySQL 的資料目錄
8.1 資料庫和檔案系統的關係
8.2 MySQL 資料目錄
8.3 資料目錄的結構
8.4 檔案系統對資料庫的影響
8.5 MySQL 系統資料庫簡介
8.6 複習
09 存放頁面的大池子--InnoDB 的表格空間
9.1 回憶一些舊知識
9.2 獨立表格空間結構
9.3 系統表格空間
9.4 複習
10 條條大路通羅馬--單表存取方法
10.1 存取方法的概念
10.2 const
10.3 ref
10.4 ref_or_null
10.5 range
10.6 index
10.7 all
10.8 注意事項
11 兩個表的親密接觸--連接的原理
11.1 連接簡介
11.2 連接的原理
11.3 複習
12 誰最便宜就選誰--基於成本的最佳化
12.1 什麼是成本
12.2 單表查詢的成本
12.3 連接查詢的成本
12.4 調節成本常數
12.5 複習
13 兵馬未動,糧草先行--InnoDB 統計資料是如何收集的
13.1 統計資料的儲存方式
13.2 基於磁碟的永久性統計資料
13.3 基於記憶體的非永久性統計資料
13.4 innodb_stats_method 的使用
13.5 複習
14 基於規則的最佳化(內含子查詢最佳化二三事)
14.1 條件化簡
14.2 外連接消除
14.3 子查詢最佳化
14.4 複習
15 查詢最佳化的百科全書--EXPLAIN 詳解
15.1 執行計畫輸出中各列詳解
15.2 JSON 格式的執行計畫
15.3 Extented EXPLAIN
15.4 複習
16 神兵利器-- optimizer trace的神奇功效
16.1 optimizer trace 簡介
16.2 透過optimizer trace 分析查詢最佳化工具的具體工作過程
17 調節磁碟和CPU 的矛盾--InnoDB 的Buffer Pool
17.1 快取的重要性
17.2 InnoDB 的Buffer Pool
17.3 複習
18 從貓爺借錢說起-- 交易簡介
18.1 交易的起源
18.2 交易的概念
18.3 MySQL 中交易的語法
18.4 複習
19 說過的話就一定要做到--redo 記錄檔
19.1 事先說明
19.2 redo 記錄檔是什麼
19.3 redo 記錄檔格式
19.4 Mini-Transaction
19.5 redo 記錄檔的寫入過程
19.6 redo 記錄檔
19.7 log sequence number
19.8 checkpoint
19.9 使用者執行緒批次從flush鏈結串列中刷出髒頁
19.10 查看系統中的各種lsn 值
19.11 innodb_flush_log_at_trx_
19.12 崩潰恢復
19.13 遺漏的問題:LOG_BLOCK_HDR_NO 是如何計算的
19.14 複習
20 後悔了怎麼辦-- undo記錄檔
20.1 交易復原的需求
20.2 交易id
20.3 undo 記錄檔的格式
20.4 通用鏈結串列結構
20.5 FIL_PAGE_UNDO_LOG頁面
20.6 Undo 頁面鏈結串列
20.7 undo 記錄檔具體寫入過程
20.8 重用Undo 頁面
20.9 回覆段
20.10 回覆段相關設定
20.11 undo 記錄檔在崩潰恢復時的作用
20.12 複習
21 一筆記錄的多副面孔--交易隔離等級和MVCC
21.1 事前準備
21.2 交易隔離等級
21.3 MVCC 原理
21.4 關於purge
21.5 複習
22 工作面試老大難-- 鎖
22.1 解決併發交易帶來問題的兩種基本方式
22.2 多粒度鎖
22.3 MySQL 中的行鎖和表鎖
22.4 敘述加鎖分析
22.5 查看交易加鎖情況
22.6 鎖死
22
序/導讀
序
※ 為什麼要寫作本書
作為一名智商平平的程式設計師,在日常學習過程中經常會遇到兩種很尷尬的情況:
■ 學習資料極其晦澀,看起來都是些高大上的知識,看著看著就睏了;
■ 很多通俗易懂的資料感覺就是小兒科,看完了跟沒看差不多。
而廣大的讀者其實需要經歷一個由淺入深的平緩學習曲線,並且這個學習的過程不至於特別地無聊。我靈機一動,這天底下和我一樣的同學肯定有很多很多,如果我能把那些晦澀難懂的知識按照尊重學習者認知規律的方式表達出來,那豈不是一件極其有意義的事情嗎? 畢竟我一個人敲程式創造的價值和讓成千上方的人快速、友善地學會一門專業知識所創造的價值是遠遠不能比的。當然,這是一個美好的想法,做這個事情是需要投入巨大的精力的。於是我辭掉了工作,放棄了週末,決心花上幾年時間來做這件能讓我「天天打雞血」的工作。
寫作本書的時間主要花在了以下這兩個方面:
自己搞清楚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 和出版社聯絡,謝謝各位。