資料庫解剖學:從內部深解 MySQL 運作原理
內容描述
會用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運行原理的優秀圖書。
目錄大綱
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_attrx
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.7 複習
A 參考資料
作者介紹
小孩子4919
前線上教育公司「跟誰學」後端工程師,公眾號「我們都是小青蛙」作者,喜歡研究原始程式碼,覺得把複雜的問題講清楚是一件很厲害的事情。