《高性能MySQL(第3版)》是MySQL領域的經典之作,擁有廣泛的影響力。第3版更新了大量的內容,不但涵蓋了最新MySQL5.5版本的新特性,也講述了關于固態(tài)盤、高可擴展性設計和云計算環(huán)境下的數據庫相關的新內容,原有的基準測試和性能優(yōu)化部分也做了大量的擴展和補充!陡咝阅躆ySQL(第3版)》共分為16章和6個附錄,內容涵蓋MySQL架構和歷史,基準測試和性能剖析,數據庫軟硬件性能優(yōu)化,復制、備份和恢復,高可用與高可擴展性,以及云端的MySQL和MySQL相關工具等方面的內容。每一章都是相對獨立的主題,讀者可以有選擇性地單獨閱讀。
《高性能MySQL(第3版)》不但適合數據庫管理員(DBA)閱讀,也適合開發(fā)人員參考學習。不管是數據庫新手還是專家,相信都能從《高性能MySQL(第3版)》有所收獲。
“只要你不敢以MySQL專家自詡,又豈敢錯過這本神書?”“一言以蔽之,寫得好,編排得好,需要參考時容易到爆!”“我可是從頭到尾看了一遍上一版,可還是毫不猶豫拿起了這本書,而且看完后一點都不后悔……”
目錄
推薦序
前言
第1章 MySQL 架構與歷史
1.1 MySQL 邏輯架構
1.1.1 連接管理與安全性
1.1.2 優(yōu)化與執(zhí)行
1.2 并發(fā)控制
1.2.1 讀寫鎖
1.2.2 鎖粒度
1.3 事務
1.3.1 隔離級別
1.3.2 死鎖
1.3.3 事務日志
1.3.4 MySQL 中的事務
1.4 多版本并發(fā)控制
1.5 MySQL 的存儲引擎
1.5.1 InnoDB 存儲引擎
1.5.2 MyISAM 存儲引擎
1.5.3 MySQL 內建的其他存儲引擎
1.5.4 第三方存儲引擎
1.5.5 選擇合適的引擎
1.5.6 轉換表的引擎
1.6 MySQL 時間線(Timeline)
1.7 MySQL 的開發(fā)模式
1.8 總結
第2章 MySQL 基準測試
2.1 為什么需要基準測試
2.2 基準測試的策略
2.2.1 測試何種指標
2.3 基準測試方法
2.3.1 設計和規(guī)劃基準測試
2.3.2 基準測試應該運行多長時間
2.3.3 獲取系統(tǒng)性能和狀態(tài)
2.3.4 獲得準確的測試結果
2.3.5 運行基準測試并分析結果
2.3.6 繪圖的重要性
2.4 基準測試工具
2.4.1 集成式測試工具
2.4.2 單組件式測試工具
2.5 基準測試案例
2.5.1 http_load
2.5.2 MySQL 基準測試套件 .
2.5.3 sysbench
2.5.4 數據庫測試套件中的dbt2 TPC-C 測試
2.5.5 Percona 的TPCC-MySQL 測試工具
2.6 總結
第3章 服務器性能剖析
3.1 性能優(yōu)化簡介
3.1.1 通過性能剖析進行優(yōu)化
3.1.2 理解性能剖析
3.2 對應用程序進行性能剖析
3.2.1 測量PHP 應用程序
3.3 剖析MySQL 查詢
3.3.1 剖析服務器負載
3.3.2 剖析單條查詢
3.3.3 使用性能剖析
3.4 診斷間歇性問題
3.4.1 單條查詢問題還是服務器問題
3.4.2 捕獲診斷數據
3.4.3 一個診斷案例
3.5 其他剖析工具
3.5.1 使用USER_STATISTICS 表
3.5.2 使用strace
3.6 總結
第4章 Schema 與數據類型優(yōu)化
4.1 選擇優(yōu)化的數據類型
4.1.1 整數類型
4.1.2 實數類型
4.1.3 字符串類型
4.1.4 日期和時間類型
4.1.5 位數據類型
4.1.6 選擇標識符(identifier)
4.1.7 特殊類型數據
4.2 MySQL schema 設計中的陷阱
4.3 范式和反范式
4.3.1 范式的優(yōu)點和缺點
4.3.2 反范式的優(yōu)點和缺點 .
4.3.3 混用范式化和反范式化
4.4 緩存表和匯總表
4.4.1 物化視圖
4.4.2 計數器表
4.5 加快ALTER TABLE 操作的速度
4.5.1 只修改.frm 文件
4.5.2 快速創(chuàng)建MyISAM 索引
4.6 總結
第5章 創(chuàng)建高性能的索引
5.1 索引基礎
5.1.1 索引的類型
5.2 索引的優(yōu)點
5.3 高性能的索引策略
5.3.1 獨立的列
5.3.2 前綴索引和索引選擇性
5.3.3 多列索引
5.3.4 選擇合適的索引列順序
5.3.5 聚簇索引
5.3.6 覆蓋索引
5.3.7 使用索引掃描來做排序
5.3.8 壓縮(前綴壓縮)索引
5.3.9 冗余和重復索引
5.3.10 未使用的索引
5.3.11 索引和鎖
5.4 索引案例學習
5.4.1 支持多種過濾條件
5.4.2 避免多個范圍條件
5.4.3 優(yōu)化排序
5.5 維護索引和表
5.5.1 找到并修復損壞的表 .
5.5.2 更新索引統(tǒng)計信息
5.5.3 減少索引和數據的碎片
5.6 總結
第6章 查詢性能優(yōu)化
6.1 為什么查詢速度會慢
6.2 慢查詢基礎:優(yōu)化數據訪問
6.2.1 是否向服務器請求了不需要的數據
6.2.2 MySQL 是否在掃描額外的記錄
6.3 重構查詢的方式
6.3.1 一個復雜查詢還是多個簡單查詢
6.3.2 切分查詢
6.3.3 分解關聯(lián)查詢
6.4 查詢執(zhí)行的基礎
6.4.1 MySQL 客戶端/ 服務器通信協(xié)議
6.4.2 查詢緩存
6.4.3 查詢優(yōu)化處理
6.4.4 查詢執(zhí)行引擎
6.4.5 返回結果給客戶端
6.5 MySQL 查詢優(yōu)化器的局限性
6.5.1 關聯(lián)子查詢
6.5.2 UNION 的限制
6.5.3 索引合并優(yōu)化
6.5.4 等值傳遞
6.5.5 并行執(zhí)行
6.5.6 哈希關聯(lián)
6.5.7 松散索引掃描
6.5.8 最大值和最小值優(yōu)化 .
6.5.9 在同一個表上查詢和更新
6.6 查詢優(yōu)化器的提示(hint)
6.7 優(yōu)化特定類型的查詢
6.7.1 優(yōu)化COUNT() 查詢
6.7.2 優(yōu)化關聯(lián)查詢
6.7.3 優(yōu)化子查詢
6.7.4 優(yōu)化GROUP BY 和DISTINCT
6.7.5 優(yōu)化LIMIT 分頁
6.7.6 優(yōu)化SQL_CALC_FOUND_ROWS
6.7.7 優(yōu)化UNION 查詢
6.7.8 靜態(tài)查詢分析
6.7.9 使用用戶自定義變量 .
6.8 案例學習
6.8.1 使用MySQL 構建一個隊列表
6.8.2 計算兩點之間的距離 .
6.8.3 使用用戶自定義函數 .
6.9 總結
第7章 MySQL 高級特性
7.1 分區(qū)表
7.1.1 分區(qū)表的原理
7.1.2 分區(qū)表的類型
7.1.3 如何使用分區(qū)表
7.1.4 什么情況下會出問題 .
7.1.5 查詢優(yōu)化
7.1.6 合并表
7.2 視圖
7.2.1 可更新視圖
7.2.2 視圖對性能的影響
7.2.3 視圖的限制
7.3 外鍵約束
7.4 在MySQL 內部存儲代碼
7.4.1 存儲過程和函數
7.4.2 觸發(fā)器
7.4.3 事件
7.4.4 在存儲程序中保留注釋
7.5 游標
7.6 綁定變量
7.6.1 綁定變量的優(yōu)化
7.6.2 SQL 接口的綁定變量
7.6.3 綁定變量的限制
7.7 用戶自定義函數
7.8 插件
7.9 字符集和校對
7.9.1 MySQL 如何使用字符集
7.9.2 選擇字符集和校對規(guī)則
7.9.3 字符集和校對規(guī)則如何影響查詢
7.10 全文索引
7.10.1 自然語言的全文索引
7.10.2 布爾全文索引
7.10.3 MySQL5.1 中全文索引的變化
7.10.4 全文索引的限制和替代方案
7.10.5 全文索引的配置和優(yōu)化
7.11 分布式(XA)事務
7.11.1 內部XA 事務
7.11.2 外部XA 事務
7.12 查詢緩存
7.12.1 MySQL 如何判斷緩存命中
7.12.2 查詢緩存如何使用內存
7.12.3 什么情況下查詢緩存能發(fā)揮作用
7.12.4 如何配置和維護查詢緩存
7.12.5 InnoDB 和查詢緩存 .
7.12.6 通用查詢緩存優(yōu)化
7.12.7 查詢緩存的替代方案
7.13 總結
第8章 優(yōu)化服務器設置
8.1 MySQL 配置的工作原理
8.1.1 語法、作用域和動態(tài)性
8.1.2 設置變量的副作用
8.1.3 入門
8.1.4 通過基準測試迭代優(yōu)化
8.2 什么不該做
8.3 創(chuàng)建MySQL 配置文件
8.3.1 檢查MySQL 服務器狀態(tài)變量
8.4 配置內存使用
8.4.1 MySQL 可以使用多少內存?
8.4.2 每個連接需要的內存 .
8.4.3 為操作系統(tǒng)保留內存 .
8.4.4 為緩存分配內存
8.4.5 InnoDB 緩沖池(Buffer Pool)
8.4.6 MyISAM 鍵緩存(Key Caches)
8.4.7 線程緩存
8.4.8 表緩存(Table Cache)
8.4.9 InnoDB 數據字典(Data Dictionary)
8.5 配置MySQL 的I/O 行為
8.5.1 InnoDB I/O 配置
8.5.2 MyISAM 的I/O 配置 .
8.6 配置MySQL 并發(fā) .
8.6.1 InnoDB 并發(fā)配置
8.6.2 MyISAM 并發(fā)配置
8.7 基于工作負載的配置
8.7.1 優(yōu)化BLOB 和TEXT 的場景
8.7.2 優(yōu)化排序(Filesorts).
8.8 完成基本配置
8.9 安全和穩(wěn)定的設置
8.10 高級InnoDB 設置
8.11 總結
第9章 操作系統(tǒng)和硬件優(yōu)化
9.1 什么限制了MySQL 的性能
9.2 如何為MySQL 選擇CPU
9.2.1 哪個更好:更快的CPU 還是更多的CPU
9.2.2 CPU 架構
9.2.3 擴展到多個CPU 和核心
9.3 平衡內存和磁盤資源
9.3.1 隨機I/O 和順序I/O
9.3.2 緩存,讀和寫
9.3.3 工作集是什么
9.3.4 找到有效的內存/ 磁盤比例
9.3.5 選擇硬盤
9.4 固態(tài)存儲
9.4.1 閃存概述
9.4.2 閃存技術
9.4.3 閃存的基準測試
9.4.4 固態(tài)硬盤驅動器(SSD)
9.4.5 PCIe 存儲設備
9.4.6 其他類型的固態(tài)存儲 .
9.4.7 什么時候應該使用閃存
9.4.8 使用Flashcache
9.4.9 優(yōu)化固態(tài)存儲上的MySQL
9.5 為備庫選擇硬件
9.6 RAID 性能優(yōu)化
9.6.1 RAID 的故障轉移、恢復和鏡像
9.6.2 平衡硬件RAID 和軟件RAID
9.6.3 RAID 配置和緩存
9.7 SAN 和NAS
9.7.1 SAN 基準測試
9.7.2 使用基于NFS 或SMB 的SAN
9.7.3 MySQL 在SAN 上的性能
9.7.4 應該用SAN 嗎
9.8 使用多磁盤卷
9.9 網絡配置
9.10 選擇操作系統(tǒng)
9.11 選擇文件系統(tǒng)
9.12 選擇磁盤隊列調度策略
9.13 線程
9.14 內存交換區(qū)
9.15 操作系統(tǒng)狀態(tài)
9.15.1 如何閱讀vmstat 的輸出
9.15.2 如何閱讀iostat 的輸出
9.15.3 其他有用的工具
9.15.4 CPU 密集型的機器
9.15.5 I/O 密集型的機器
9.15.6 發(fā)生內存交換的機器
9.15.7 空閑的機器
9.16 總結
第10章 復制
10.1 復制概述
10.1.1 復制解決的問題
10.1.2 復制如何工作
10.2 配置復制
10.2.1 創(chuàng)建復制賬號
10.2.2 配置主庫和備庫
10.2.3 啟動復制
10.2.4 從另一個服務器開始復制
10.2.5 推薦的復制配置
10.3 復制的原理
10.3.1 基于語句的復制
10.3.2 基于行的復制
10.3.3 基于行或基于語句:哪種更優(yōu)
10.3.4 復制文件
10.3.5 發(fā)送復制事件到其他備庫
10.3.6 復制過濾器
10.4 復制拓撲
10.4.1 一主庫多備庫
10.4.2 主動- 主動模式下的主- 主復制
10.4.3 主動- 被動模式下的主- 主復制
10.4.4 擁有備庫的主- 主結構
10.4.5 環(huán)形復制
10.4.6 主庫、分發(fā)主庫以及備庫
10.4.7 樹或金字塔形
10.4.8 定制的復制方案
10.5 復制和容量規(guī)劃
10.5.1 為什么復制無法擴展寫操作
10.5.2 備庫什么時候開始延遲
10.5.3 規(guī)劃冗余容量
10.6 復制管理和維護
10.6.1 監(jiān)控復制
10.6.2 測量備庫延遲
10.6.3 確定主備是否一致
10.6.4 從主庫重新同步備庫
10.6.5 改變主庫
10.6.6 在一個主- 主配置中交換角色
10.7 復制的問題和解決方案
10.7.1 數據損壞或丟失的錯誤
10.7.2 使用非事務型表
10.7.3 混合事務型和非事務型表
10.7.4 不確定語句
10.7.5 主庫和備庫使用不同的存儲引擎
10.7.6 備庫發(fā)生數據改變
10.7.7 不唯一的服務器ID .
10.7.8 未定義的服務器ID .
10.7.9 對未復制數據的依賴性
10.7.10 丟失的臨時表
10.7.11 不復制所有的更新 .
10.7.12 InnoDB 加鎖讀引起的鎖爭用
10.7.13 在主- 主復制結構中寫入兩臺主庫
10.7.14 過大的復制延遲
10.7.15 來自主庫的過大的包
10.7.16 受限制的復制帶寬 .
10.7.17 磁盤空間不足
10.7.18 復制的局限性
10.8 復制有多快
10.9 MySQL 復制的高級特性
10.10 其他復制技術
10.11 總結
第11章 可擴展的MySQL
11.1 什么是可擴展性
11.1.1 正式的可擴展性定義
11.2 擴展MySQL
11.2.1 規(guī)劃可擴展性
11.2.2 為擴展贏得時間
11.2.3 向上擴展
11.2.4 向外擴展
11.2.5 通過多實例擴展
11.2.6 通過集群擴展
11.2.7 向內擴展
11.3 負載均衡
11.3.1 直接連接
11.3.2 引入中間件
11.3.3 一主多備間的負載均衡
11.4 總結
第12章 高可用性
12.1 什么是高可用性
12.2 導致宕機的原因
12.3 如何實現高可用性
12.3.1 提升平均失效時間(MTBF)
12.3.2 降低平均恢復時間(MTTR)
12.4 避免單點失效
12.4.1 共享存儲或磁盤復制
12.4.2 MySQL 同步復制
12.4.3 基于復制的冗余
12.5 故障轉移和故障恢復
12.5.1 提升備庫或切換角色
12.5.2 虛擬IP 地址或IP 接管
12.5.3 中間件解決方案
12.5.4 在應用中處理故障轉移
12.6 總結
第13章 云端的MySQL
13.1 云的優(yōu)點、缺點和相關誤解
13.2 MySQL 在云端的經濟價值
13.3 云中的MySQL 的可擴展性和高可用性
13.4 四種基礎資源
13.5 MySQL 在云主機上的性能
13.5.1 在云端的MySQL 基準測試
13.6 MySQL 數據庫即服務(DBaaS)
13.6.1 Amazon RDS
13.6.2 其他DBaaS 解決方案
13.7 總結
第14章 應用層優(yōu)化
14.1 常見問題
14.2 Web 服務器問題
14.2.1 尋找最優(yōu)并發(fā)度
14.3 緩存
14.3.1 應用層以下的緩存
14.3.2 應用層緩存
14.3.3 緩存控制策略
14.3.4 緩存對象分層
14.3.5 預生成內容
14.3.6 作為基礎組件的緩存
14.3.7 使用HandlerSocket 和memcached
14.4 拓展MySQL
14.5 MySQL 的替代品
14.6 總結
第15章 備份與恢復
15.1 為什么要備份
15.2 定義恢復需求
15.3 設計MySQL 備份方案
15.3.1 在線備份還是離線備份
15.3.2 邏輯備份還是物理備份
15.3.3 備份什么
15.3.4 存儲引擎和一致性
15.4 管理和備份二進制日志
15.4.1 二進制日志格式
15.4.2 安全地清除老的二進制日志
15.5 備份數據
15.5.1 生成邏輯備份
15.5.2 文件系統(tǒng)快照
15.6 從備份中恢復
15.6.1 恢復物理備份
15.6.2 還原邏輯備份
15.6.3 基于時間點的恢復
15.6.4 更高級的恢復技術
15.6.5 InnoDB 崩潰恢復
15.7 備份和恢復工具
15.7.1 MySQL Enterprise Backup
15.7.2 Percona XtraBackup .
15.7.3 mylvmbackup
15.7.4 Zmanda Recovery Manager
15.7.5 mydumper
15.7.6 mysqldump.
15.8 備份腳本化
15.9 總結
第16章 MySQL 用戶工具
16.1 接口工具
16.2 命令行工具集
16.3 SQL 實用集
16.4 監(jiān)測工具
16.4.1 開源的監(jiān)控工具
16.4.2 商業(yè)監(jiān)控系統(tǒng)
16.4.3 Innotop 的命令行監(jiān)控
16.5 總結
附錄A MySQL 分支與變種
附錄B MySQL 服務器狀態(tài)
附錄C 大文件傳輸
附錄D EXPLAIN
附錄E 鎖的調試
附錄F 在MySQL 上使用Sphinx
索引