《MySQL是怎樣運行的:從根兒上理解 MySQL》采用詼諧幽默的表達方式,對MySQL的底層運行原理進行了介紹,內(nèi)容涵蓋了使用MySQL的同學(xué)在求職面試和工作中常見的一些核心概念?傆22 章,劃分為4個部分。第1部分介紹了MySQL入門的一些知識,比如MySQL的服務(wù)器程序和客戶端程序有哪些、MySQL的啟動選項和系統(tǒng)變量,以及使用的字符集等。第2部分是本書后續(xù)章節(jié)的基礎(chǔ),介紹了MySQL的一些基礎(chǔ)知識,比如記錄、頁面、索引、表空間的結(jié)構(gòu)和用法等。第3部分則與大家在工作中經(jīng)常遇到的查詢優(yōu)化問題緊密相關(guān),介紹了單表查詢、連接查詢的執(zhí)行原理,MySQL基于成本和規(guī)則的優(yōu)化具體指什么,并詳細分析了Explain語句的執(zhí)行結(jié)果。第4部分則是與MySQL中的事務(wù)和鎖相關(guān),介紹了事務(wù)概念的來源,MySQL是如何實現(xiàn)事務(wù)的,包括redo日志、undo日志、MVCC、各種鎖的細節(jié)等。 
盡管《MySQL是怎樣運行的:從根兒上理解 MySQL》在寫作時參考的MySQL源代碼版本是5.7.22,但是大部分內(nèi)容與具體的版本號并沒有多大關(guān)系。無論是很早之前就已身居MySQL專家的人員,還是希望進一步提升技能的DBA,甚至是三五年后才會入行的“萌新”,本書都是他們徹底了解MySQL運行原理的優(yōu)秀圖書。
		 
	
                                深入剖析MySQL數(shù)據(jù)庫運行機制的優(yōu)秀讀物! 
更好、更快地幫助讀者掌握MySQL專業(yè)技術(shù)知識! 
 
1.采用詼諧幽默的表達方式,全文采用大白話寫成; 
2.作者畫了200多幅圖輔助講解重點、細節(jié)內(nèi)容,提供書中彩圖文件下載; 
3.尊重用戶體驗:嘗試根據(jù)用戶認知順序,使用更人性化的語言去解釋看似很復(fù)雜的技術(shù)問題; 
4.層層鋪墊的結(jié)構(gòu)劃分:本書覆蓋的內(nèi)容形成了一個閉環(huán),看完本書希望讀者能有一種看完整個故事的感覺; 
5.提供方便的答疑渠道:讀者在學(xué)習(xí)過程中遇到的疑惑可以很快得到解答; 
6.盡管本書在寫作時參考的MySQL源碼版本是5.7.22,但是書中大部分知識與具體的MySQL版本并沒有太大關(guān)系。偶有幾處與特定版本相關(guān)的地方,本書也進行了明確強調(diào); 
7.雙色印刷。 
 
為什么這個SQL語句執(zhí)行得這么慢?為什么我明明建立了索引,但是查詢計劃顯示沒用?為什么IN查詢中的參數(shù)一多就不使用索引了?為什么我的數(shù)據(jù)顯示成了亂碼?……每一位DBA和后端開發(fā)人員在與MySQL打交道時,或多或少都會遇到這些問題。之外,索引結(jié)構(gòu)、MVCC、隔離級別的實現(xiàn)、鎖的使用等知識,也是求職人員在MySQL面試中躲不過去的高頻問題。 
本書針對上面這些問題給出了相應(yīng)的解答方案。本書的表達方式與司空見慣的學(xué)術(shù)派、理論派IT圖書有顯著區(qū)別,但也是相當(dāng)正經(jīng)的專業(yè)技術(shù)圖書,內(nèi)容涵蓋了使用MySQL的同學(xué)在求職面試和工作中常見的一些核心概念。無論是身居MySQL專家身份的技術(shù)人員,還是技術(shù)有待進一步提升的DBA,甚至是剛投身于數(shù)據(jù)庫行業(yè)的“萌新”人員,本書都是他們徹底了解MySQL運行原理的優(yōu)秀圖書。            
第0章 楔子——閱讀前必看 1 
第 1章 裝作自己是個小白——初識MySQL 3 
1.1 MySQL的客戶端/服務(wù)器架構(gòu) 3 
1.2 MySQL的安裝 3 
1.3 啟動MySQL服務(wù)器程序 5 
1.3.1 在類UNIX系統(tǒng)中啟動服務(wù)器程序 5 
1.3.2 在Windows系統(tǒng)中啟動服務(wù)器程序 6 
1.4 啟動MySQL客戶端程序 7 
1.5 客戶端與服務(wù)器連接的過程 10 
1.5.1 TCP/IP 10 
1.5.2 命名管道和共享內(nèi)存 10 
1.5.3 UNIX域套接字 11 
1.6 服務(wù)器處理客戶端請求 11 
1.6.1 連接管理 12 
1.6.2 解析與優(yōu)化 12 
1.6.3 存儲引擎 14 
1.7 常用存儲引擎 14 
1.8 關(guān)于存儲引擎的一些操作 16 
1.8.1 查看當(dāng)前服務(wù)器程序支持的存儲引擎 16 
1.8.2 設(shè)置表的存儲引擎 16 
1.9 總結(jié) 17 
第 2章 MySQL的調(diào)控按鈕——啟動選項和系統(tǒng)變量 19 
2.1 啟動選項和配置文件 19 
2.1.1 在命令行上使用選項 19 
2.1.2 配置文件中使用選項 21 
2.1.3 在命令行和配置文件中啟動選項的區(qū)別 26 
2.2 系統(tǒng)變量 27 
2.2.1 系統(tǒng)變量簡介 27 
2.2.2 查看系統(tǒng)變量 27 
2.2.3 設(shè)置系統(tǒng)變量 28 
2.3 狀態(tài)變量 32 
2.4 總結(jié) 32 
第3章 字符集和比較規(guī)則 34 
3.1 字符集和比較規(guī)則簡介 34 
3.1.1 字符集簡介 34 
3.1.2 比較規(guī)則簡介 34 
3.1.3 一些重要的字符集 35 
3.2 MySQL中支持的字符集和比較規(guī)則 36 
3.2.1 MySQL中的utf8和utf8mb4 36 
3.2.2 字符集的查看 36 
3.2.3 比較規(guī)則的查看 38 
3.3 字符集和比較規(guī)則的應(yīng)用 39 
3.3.1 各級別的字符集和比較規(guī)則 39 
3.3.2 客戶端和服務(wù)器通信過程中使用的字符集 44 
3.3.3 比較規(guī)則的應(yīng)用 52 
3.4 總結(jié) 53 
第4章 從一條記錄說起——InnoDB記錄存儲結(jié)構(gòu) 55 
4.1 準(zhǔn)備工作 55 
4.2 InnoDB頁簡介 55 
4.3 InnoDB行格式 56 
4.3.1 指定行格式的語法 56 
4.3.2 COMPACT行格式 56 
4.3.3 REDUNDANT行格式 64 
4.3.4 溢出列 68 
4.3.5 DYNAMIC行格式和COMPRESSED行格式 70 
4.4 總結(jié) 71 
第5章 盛放記錄的大盒子——InnoDB數(shù)據(jù)頁結(jié)構(gòu) 72 
5.1 不同類型的頁簡介 72 
5.2 數(shù)據(jù)頁結(jié)構(gòu)快覽 72 
5.3 記錄在頁中的存儲 73 
5.4 Page Directory(頁目錄) 80 
5.5 Page Header(頁面頭部) 85 
5.6 File Header(文件頭部) 86 
5.7 File Trailer(文件尾部) 88 
5.8 總結(jié) 88 
第6章 快速查詢的秘籍——B+樹索引 90 
6.1 沒有索引時進行查找 90 
6.1.1 在一個頁中查找 90 
6.1.2 在很多頁中查找 91 
6.2 索引 91 
6.2.1 一個簡單的索引方案 92 
6.2.2 InnoDB中的索引方案 94 
6.2.3 InnoDB中B+樹索引的注意事項 102 
6.2.4 MyISAM中的索引方案簡介 104 
6.2.5 MySQL中創(chuàng)建和刪除索引的語句 105 
6.3 總結(jié) 106 
第7章 B+樹索引的使用 107 
7.1 B+樹索引示意圖的簡化 107 
7.2 索引的代價 109 
7.3 應(yīng)用B+樹索引 110 
7.3.1 掃描區(qū)間和邊界條件 110 
7.3.2 索引用于排序 122 
7.3.3 索引用于分組 125 
7.4 回表的代價 126 
7.5 更好地創(chuàng)建和使用索引 127 
7.5.1 只為用于搜索、排序或分組的列創(chuàng)建索引 127 
7.5.2 考慮索引列中不重復(fù)值的個數(shù) 127 
7.5.3 索引列的類型盡量小 127 
7.5.4 為列前綴建立索引 128 
7.5.5 覆蓋索引 129 
7.5.6 讓索引列以列名的形式在搜索條件中單獨出現(xiàn) 129 
7.5.7 新插入記錄時主鍵大小對效率的影響 129 
7.5.8 冗余和重復(fù)索引 130 
7.6 總結(jié) 131 
第8章 數(shù)據(jù)的家——MySQL的數(shù)據(jù)目錄 132 
8.1 數(shù)據(jù)庫和文件系統(tǒng)的關(guān)系 132 
8.2 MySQL數(shù)據(jù)目錄 132 
8.2.1 數(shù)據(jù)目錄和安裝目錄的區(qū)別 132 
8.2.2 如何確定MySQL中的數(shù)據(jù)目錄 132 
8.3 數(shù)據(jù)目錄的結(jié)構(gòu) 133 
8.3.1 數(shù)據(jù)庫在文件系統(tǒng)中的表示 133 
8.3.2 表在文件系統(tǒng)中的表示 134 
8.3.3 其他的文件 137 
8.4 文件系統(tǒng)對數(shù)據(jù)庫的影響 137 
8.5 MySQL系統(tǒng)數(shù)據(jù)庫簡介 138 
8.6 總結(jié) 138 
第9章 存放頁面的大池子——InnoDB的表空間 140 
9.1 回憶一些舊知識 140 
9.1.1 頁面類型 140 
9.1.2 頁面通用部分 141 
9.2 獨立表空間結(jié)構(gòu) 142 
9.2.1 區(qū)的概念 142 
9.2.2 段的概念 144 
9.2.3 區(qū)的分類 145 
9.2.4 段的結(jié)構(gòu) 149 
9.2.5 各類型頁面詳細情況 150 
9.2.6 Segment Header結(jié)構(gòu)的運用 156 
9.2.7 真實表空間對應(yīng)的文件大小 157 
9.3 系統(tǒng)表空間 158 
9.4 總結(jié) 164 
第 10章 條條大路通羅馬——單表訪問方法 166 
10.1 訪問方法的概念 167 
10.2 const 167 
10.3 ref 168 
10.4 ref_or_null 170 
10.5 range 171 
10.6 index 171 
10.7 all 172 
10.8 注意事項 172 
10.8.1 重溫二級索引+回表 172 
10.8.2 索引合并 173 
10.9 總結(jié) 177 
第 11章 兩個表的親密接觸——連接的原理 178 
11.1 連接簡介 178 
11.1.1 連接的本質(zhì) 178 
11.1.2 連接過程簡介 180 
11.1.3 內(nèi)連接和外連接 181 
11.2 連接的原理 185 
11.2.1 嵌套循環(huán)連接 186 
11.2.2 使用索引加快連接速度 187 
11.2.3 基于塊的嵌套循環(huán)連接 188 
11.3 總結(jié) 189 
第 12章 誰最便宜就選誰——基于成本的優(yōu)化 190 
12.1 什么是成本 190 
12.2 單表查詢的成本 190 
12.2.1 準(zhǔn)備工作 190 
12.2.2 基于成本的優(yōu)化步驟 191 
12.2.3 基于索引統(tǒng)計數(shù)據(jù)的成本計算 198 
12.3 連接查詢的成本 201 
12.3.1 準(zhǔn)備工作 201 
12.3.2 條件過濾(Condition Filtering) 201 
12.3.3 兩表連接的成本分析 203 
12.3.4 多表連接的成本分析 205 
12.4 調(diào)節(jié)成本常數(shù) 206 
12.4.1 mysql.server_cost表 206 
12.4.2 mysql.engine_cost表 208 
12.5 總結(jié) 209 
第 13章 兵馬未動,糧草先行——InnoDB統(tǒng)計數(shù)據(jù)是如何收集的 210 
13.1 統(tǒng)計數(shù)據(jù)的存儲方式 210 
13.2 基于磁盤的永久性統(tǒng)計數(shù)據(jù) 211 
13.2.1 innodb_table_stats 211 
13.2.2 innodb_index_stats 214 
13.2.3 定期更新統(tǒng)計數(shù)據(jù) 215 
13.2.4 手動更新innodb_table_stats和innodb_index_stats表 216 
13.3 基于內(nèi)存的非永久性統(tǒng)計數(shù)據(jù) 217 
13.4 innodb_stats_method的使用 217 
13.5 總結(jié) 219 
第 14章 基于規(guī)則的優(yōu)化(內(nèi)含子查詢優(yōu)化二三事) 220 
14.1 條件化簡 220 
14.1.1 移除不必要的括號 220 
14.1.2 常量傳遞 220 
14.1.3 移除沒用的條件 221 
14.1.4 表達式計算 221 
14.1.5 HAVING子句和WHERE子句的合并 221 
14.1.6 常量表檢測 221 
14.2 外連接消除 222 
14.3 子查詢優(yōu)化 224 
14.3.1 子查詢語法 225 
14.3.2 子查詢在MySQL中是怎么執(zhí)行的 230 
14.4 總結(jié) 244 
第 15章 查詢優(yōu)化的百科全書——EXPLAIN詳解 245 
15.1 執(zhí)行計劃輸出中各列詳解 246 
15.1.1 table 246 
15.1.2 id 247 
15.1.3 select_type 249 
15.1.4 partitions 252 
15.1.5 type 252 
15.1.6 possible_keys和key 255 
15.1.7 key_len 256 
15.1.8 ref 258 
15.1.9 rows 258 
15.1.10 filtered 259 
15.1.11 Extra 260 
15.2 JSON格式的執(zhí)行計劃 266 
15.3 Extented EXPLAIN 268 
15.4 總結(jié) 269 
第 16章 神兵利器——optimizer trace的神奇功效 270 
16.1 optimizer trace簡介 270 
16.2 通過optimizer trace分析查詢優(yōu)化器的具體工作過程 271 
第 17章 調(diào)節(jié)磁盤和CPU的矛盾——InnoDB的Buffer Pool 278 
17.1 緩存的重要性 278 
17.2 InnoDB的Buffer Pool 278 
17.2.1 啥是Buffer Pool 278 
17.2.2 Buffer Pool內(nèi)部組成 278 
17.2.3 free鏈表的管理 279 
17.2.4 緩沖頁的哈希處理 280 
17.2.5 flush鏈表的管理 281 
17.2.6 LRU鏈表的管理 282 
17.2.7 其他的一些鏈表 286 
17.2.8 刷新臟頁到磁盤 287 
17.2.9 多個Buffer Pool實例 287 
17.2.10 innodb_buffer_pool_chunk_size 288 
17.2.11 配置Buffer Pool時的注意事項 289 
17.2.12 查看Buffer Pool的狀態(tài)信息 291 
17.3 總結(jié) 293 
第 18章 從貓爺借錢說起——事務(wù)簡介 294 
18.1 事務(wù)的起源 294 
18.1.1 原子性(Atomicity) 295 
18.1.2 隔離性(Isolation) 295 
18.1.3 一致性(Consistency) 296 
18.1.4 持久性(Durability) 298 
18.2 事務(wù)的概念 298 
18.3 MySQL中事務(wù)的語法 300 
18.3.1 開啟事務(wù) 300 
18.3.2 提交事務(wù) 301 
18.3.3 手動中止事務(wù) 302 
18.3.4 支持事務(wù)的存儲引擎 302 
18.3.5 自動提交 303 
18.3.6 隱式提交 304 
18.3.7 保存點 305 
18.4 總結(jié) 307 
第 19章 說過的話就一定要做到——redo日志 308 
19.1 事先說明 308 
19.2 redo日志是啥 308 
19.3 redo日志格式 309 
19.3.1 簡單的redo日志類型 309 
19.3.2 復(fù)雜一些的redo日志類型 311 
19.3.3 redo日志格式小結(jié) 314 
19.4 Mini-Transaction 315 
19.4.1 以組的形式寫入redo日志 315 
19.4.2 Mini-Transaction的概念 319 
19.5 redo日志的寫入過程 319 
19.5.1 redo log block 319 
19.5.2 redo日志緩沖區(qū) 320 
19.5.3 redo日志寫入log buffer 321 
19.6 redo日志文件 323 
19.6.1 redo日志刷盤時機 323 
19.6.2 redo日志文件組 323 
19.6.3 redo日志文件格式 324 
19.7 log sequence number 327 
19.7.1 flushed_to_disk_lsn 328 
19.7.2 lsn值和redo日志文件組中的偏移量的對應(yīng)關(guān)系 330 
19.7.3 flush鏈表中的lsn 330 
19.8 checkpoint 332 
19.9 用戶線程批量從flush鏈表中刷出臟頁 335 
19.10 查看系統(tǒng)中的各種lsn值 335 
19.11 innodb_flush_log_at_trx_commit的用法 336 
19.12 崩潰恢復(fù) 336 
19.12.1 確定恢復(fù)的起點 337 
19.12.2 確定恢復(fù)的終點 337 
19.12.3 怎么恢復(fù) 337 
19.13 遺漏的問題:LOG_BLOCK_HDR_NO是如何計算的 339 
19.14 總結(jié) 340 
第 20章 后悔了怎么辦——undo日志 342 
20.1 事務(wù)回滾的需求 342 
20.2 事務(wù)id 343 
20.2.1 分配事務(wù)id的時機 343 
20.2.2 事務(wù)id是怎么生成的 343 
20.2.3 trx_id隱藏列 344 
20.3 undo日志的格式 344 
20.3.1 INSERT操作對應(yīng)的undo日志 345 
20.3.2 DELETE操作對應(yīng)的undo日志 347 
20.3.3 UPDATE操作對應(yīng)的undo日志 353 
20.3.4 增刪改操作對二級索引的影響 357 
20.4 通用鏈表結(jié)構(gòu) 357 
20.5 FIL_PAGE_UNDO_LOG頁面 359 
20.6 Undo頁面鏈表 361 
20.6.1 單個事務(wù)中的Undo頁面鏈表 361 
20.6.2 多個事務(wù)中的Undo頁面鏈表 362 
20.7 undo日志具體寫入過程 363 
20.7.1 段的概念 363 
20.7.2 Undo Log Segment Header 364 
20.7.3 Undo Log Header 365 
20.7.4 小結(jié) 367 
20.8 重用Undo頁面 368 
20.9 回滾段 369 
20.9.1 回滾段的概念 369 
20.9.2 從回滾段中申請Undo頁面鏈表 371 
20.9.3 多個回滾段 372 
20.9.4 回滾段的分類 374 
20.9.5 roll_pointer的組成 374 
20.9.6 為事務(wù)分配Undo頁面鏈表的詳細過程 375 
20.10 回滾段相關(guān)配置 376 
20.10.1 配置回滾段數(shù)量 376 
20.10.2 配置undo表空間 376 
20.11 undo日志在崩潰恢復(fù)時的作用 377 
20.12 總結(jié) 377 
第 21章 一條記錄的多副面孔——事務(wù)隔離級別和MVCC 379 
21.1 事前準(zhǔn)備 379 
21.2 事務(wù)隔離級別 379 
21.2.1 事務(wù)并發(fā)執(zhí)行時遇到的一致性問題 382 
21.2.2 SQL標(biāo)準(zhǔn)中的4種隔離級別 385 
21.2.3 MySQL中支持的4種隔離級別 386 
21.3 MVCC原理 388 
21.3.1 版本鏈 388 
21.3.2 ReadView 390 
21.3.3 二級索引與MVCC 397 
21.3.4 MVCC小結(jié) 397 
21.4 關(guān)于purge 398 
21.5 總結(jié) 399 
第 22章 工作面試?yán)洗箅y——鎖 401 
22.1 解決并發(fā)事務(wù)帶來問題的兩種基本方式 401 
22.1.1 寫-寫情況 401 
22.1.2 讀-寫或?qū)?讀情況 403 
22.1.3 一致性讀 404 
22.1.4 鎖定讀 404 
22.1.5 寫操作 405 
22.2 多粒度鎖 406 
22.3 MySQL中的行鎖和表鎖 408 
22.3.1 其他存儲引擎中的鎖 408 
22.3.2 InnoDB存儲引擎中的鎖 409 
22.3.3 InnoDB鎖的內(nèi)存結(jié)構(gòu) 417 
22.4 語句加鎖分析 423 
22.4.1 普通的SELECT語句 423 
22.4.2 鎖定讀的語句 424 
22.4.3 半一致性讀的語句 441 
22.4.4 INSERT語句 442 
22.5 查看事務(wù)加鎖情況 444 
22.5.1 使用information_schema數(shù)據(jù)庫中的表獲取鎖信息 444 
22.5.2 使用SHOW ENINGE INNODB STATUS獲取鎖信息 446 
22.6 死鎖 450 
22.7 總結(jié) 454 
參考資料 455