内容
《高性能 MySQL》一直是 MySQL 领域的经典之作,影响了一代又一代的 DBA 和技术人员,从第3 版出版到第 4 版出版过去了近十年,MySQL 也从 5.5 版本更新到了 8.0 版本。第 4 版中增加了大量对 MySQL 5.7 和 8.0 版本新特性的介绍,删除了一些在新版本中已经废弃或者不再常用的功能,还增加了对云数据库的介绍,减少了在官方文档中已有的基础使用和配置相关的内容。这些年,MySQL 经过在大量大规模互联网场景中的应用验证,使得本书在继续关注高性能之外,还用了较多的篇幅来介绍如何实现 MySQL 的大规模可扩展应用和合规性问题,这是相比第 3 版最大的不同,也是本书封面上所写的“经过大规模运维验证的策略”的体现。本书适合数据库管理员(DBA)阅读,也适合系统运维和开发人员参考学习。不管你是数据库新手还是专家,相信都能从本书中有所收获。
目录
序……………………………………………………………………… xxiii
前言……………………………………………………………………. xxv
本书第 4 版的致谢…………………………………………………….. xxix
第 1 章 MySQL 架构…………………………………………………… 1
MySQL 的逻辑架构 ………………………………………………………………………………………… 1
连接管理与安全性 …………………………………………………………………………………… 2
优化与执行……………………………………………………………………………………………… 2
并发控制 ……………………………………………………………………………………………………….. 3
读写锁 ……………………………………………………………………………………………………. 3
锁的粒度 ………………………………………………………………………………………………… 4
事务 ……………………………………………………………………………………………………………… 5
隔离级别 ………………………………………………………………………………………………… 7
死锁 ……………………………………………………………………………………………………….. 8
事务日志 ………………………………………………………………………………………………… 9
MySQL 中的事务 …………………………………………………………………………………… 10
多版本并发控制 ……………………………………………………………………………………………. 12
复制 ……………………………………………………………………………………………………………. 13
数据文件结构 ………………………………………………………………………………………………. 14
InnoDB 引擎 ………………………………………………………………………………………………… 14
JSON 文档支持 ……………………………………………………………………………………… 15
数据字典的变化 …………………………………………………………………………………….. 16
原子 DDL ……………………………………………………………………………………………… 16
小结 ……………………………………………………………………………………………………………. 16
第 2 章 可靠性工程世界中的监控……………………………………….17
可靠性工程对 DBA 团队的影响 ……………………………………………………………………… 18
定义服务水平目标 ………………………………………………………………………………………… 18
怎样才能让客户满意 ………………………………………………………………………………. 19
用什么来度量 ………………………………………………………………………………………………. 20
定义 SLI 和 SLO ……………………………………………………………………………………. 20
监控解决方案 ………………………………………………………………………………………… 21
监控可用性……………………………………………………………………………………………. 22
监控查询延迟 ………………………………………………………………………………………… 24
监控报错 ………………………………………………………………………………………………. 24
主动监控 ………………………………………………………………………………………………. 25
度量长期性能 ………………………………………………………………………………………………. 31
了解业务节奏 ………………………………………………………………………………………… 31
有效地跟踪指标 …………………………………………………………………………………….. 32
使用监控工具检查性能 …………………………………………………………………………… 33
使用 SLO 来指导整体架构 ………………………………………………………………………. 34
小结 ……………………………………………………………………………………………………………. 34
第 3 章 Performance Schema……………………………………. 35
Performance Schema 介绍 ………………………………………………………………………………. 35
插桩元件 ………………………………………………………………………………………………. 36
消费者表的组织 …………………………………………………………………………………….. 37
资源消耗 ………………………………………………………………………………………………. 39
局限性 ………………………………………………………………………………………………….. 39
sys Schema ……………………………………………………………………………………………. 40
理解线程 ………………………………………………………………………………………………. 40
配置 ……………………………………………………………………………………………………………. 41
启用或禁用 Performance Schema ……………………………………………………………… 42
启用或禁用插桩 …………………………………………………………………………………….. 42
启用或禁用消费者表 ………………………………………………………………………………. 43
优化特定对象的监控 ………………………………………………………………………………. 44
优化线程的监控 …………………………………………………………………………………….. 45
调整 Performance Schema 的内存大小 ………………………………………………………. 46
默认值 ………………………………………………………………………………………………….. 46
使用 Performance Schema ………………………………………………………………………………. 46
检查 SQL 语句 ………………………………………………………………………………………. 46
检查读写性能 ………………………………………………………………………………………… 54
检查元数据锁 ………………………………………………………………………………………… 56
检查内存使用情况 …………………………………………………………………………………. 56
检查变量 ………………………………………………………………………………………………. 59
检查最常见的错误 …………………………………………………………………………………. 62
检查 Performance Schema 自身 ………………………………………………………………… 63
小结 ……………………………………………………………………………………………………………. 65
第 4 章 操作系统和硬件优化………………………………………….. 66
什么限制了 MySQL 的性能 ……………………………………………………………………………. 66
如何为 MySQL 选择 CPU ………………………………………………………………………………. 67
平衡内存和磁盘资源 …………………………………………………………………………………….. 67
缓存、读取和写入 …………………………………………………………………………………. 67
你的工作集是什么 …………………………………………………………………………………. 68
固态存储 ……………………………………………………………………………………………………… 68
闪存概述 ………………………………………………………………………………………………. 69
垃圾收集 ………………………………………………………………………………………………. 69
RAID 性能优化 …………………………………………………………………………………………….. 70
RAID 故障、恢复和监控 ………………………………………………………………………… 72
RAID 配置和缓存 ………………………………………………………………………………….. 73
网络配置 ……………………………………………………………………………………………………… 75
选择文件系统 ………………………………………………………………………………………………. 77
选择磁盘队列调度器 ………………………………………………………………………………. 79
内存和交换……………………………………………………………………………………………. 79
操作系统状态 ………………………………………………………………………………………… 81
其他有用的工具 …………………………………………………………………………………….. 84
小结 ……………………………………………………………………………………………………………. 84
第 5 章 优化服务器设置………………………………………………. 86
MySQL 的配置是如何工作的 …………………………………………………………………………. 87
语法、作用域和动态性 …………………………………………………………………………… 88
持久化系统变量 …………………………………………………………………………………….. 89
设置变量的副作用 …………………………………………………………………………………. 89
规划变量的更改 …………………………………………………………………………………….. 90
什么不该做 ………………………………………………………………………………………………….. 91
创建 MySQL 配置文件 ………………………………………………………………………………….. 92
最小化配置……………………………………………………………………………………………. 92
检查 MySQL 服务器的状态变量 ………………………………………………………………. 94
配置内存使用 ………………………………………………………………………………………………. 94
每个连接的内存需求 ………………………………………………………………………………. 94
为操作系统保留内存 ………………………………………………………………………………. 95
InnoDB 缓冲池 ………………………………………………………………………………………. 95
线程缓存 ………………………………………………………………………………………………. 96
配置 MySQL 的 I/O 行为 ……………………………………………………………………………….. 97
InnoDB 事务日志 …………………………………………………………………………………… 98
日志缓冲区……………………………………………………………………………………………. 98
InnoDB 表空间 …………………………………………………………………………………….. 100
其他 I/O 配置选项 ………………………………………………………………………………… 103
配置 MySQL 并发 ……………………………………………………………………………………….. 103
安全设置 ……………………………………………………………………………………………………. 104
高级 InnoDB 设置 ……………………………………………………………………………………….. 106
小结 ………………………………………………………………………………………………………….. 108
第 6 章 schema 设计与管理…………………………………………109
选择优化的数据类型 …………………………………………………………………………………… 109
整数类型 ………………………………………………………………………………………………111
实数类型 ………………………………………………………………………………………………111
字符串类型………………………………………………………………………………………….. 112
日期和时间类型 …………………………………………………………………………………… 117
位压缩数据类型 …………………………………………………………………………………… 119
JSON 数据类型 ……………………………………………………………………………………. 121
选择标识符………………………………………………………………………………………….. 124
特殊数据类型 ………………………………………………………………………………………. 126
MySQL schema 设计中的陷阱 ………………………………………………………………………. 127
太多的列 …………………………………………………………………………………………….. 127
太多的联接………………………………………………………………………………………….. 127
全能的枚举………………………………………………………………………………………….. 127
变相的枚举………………………………………………………………………………………….. 128
NULL 不是虚拟值………………………………………………………………………………… 128
schema 管理 ……………………………………………………………………………………………….. 128
作为数据存储平台一部分的 schema 管理 ………………………………………………… 129
小结 ………………………………………………………………………………………………………….. 135
第 7 章 创建高性能的索引…………………………………………….136
索引基础 ……………………………………………………………………………………………………. 136
索引的类型………………………………………………………………………………………….. 137
使用索引的优点 …………………………………………………………………………………… 141
高性能的索引策略 ………………………………………………………………………………………. 142
前缀索引和索引的选择性 ……………………………………………………………………… 142
多列索引 …………………………………………………………………………………………….. 145
选择合适的索引列顺序 …………………………………………………………………………. 147
聚簇索引 …………………………………………………………………………………………….. 150
覆盖索引 …………………………………………………………………………………………….. 157
使用索引扫描来做排序 …………………………………………………………………………. 159
冗余和重复索引 …………………………………………………………………………………… 161
未使用的索引 ………………………………………………………………………………………. 164
维护索引和表 …………………………………………………………………………………………….. 164
找到并修复损坏的表 …………………………………………………………………………….. 165
更新索引统计信息 ……………………………………………………………………………….. 165
减少索引和数据的碎片 …………………………………………………………………………. 167
小结 ………………………………………………………………………………………………………….. 168
第 8 章 查询性能优化…………………………………………………170
为什么查询速度会慢 …………………………………………………………………………………… 170
慢查询基础 :优化数据访问 …………………………………………………………………………. 171
是否向数据库请求了不需要的数据 ………………………………………………………… 171
MySQL 是否在扫描额外的记录 ……………………………………………………………… 173
重构查询的方式 ………………………………………………………………………………………….. 177
一个复杂查询还是多个简单查询 ……………………………………………………………. 177
切分查询 …………………………………………………………………………………………….. 178
分解联接查询 ………………………………………………………………………………………. 178
查询执行的基础 ………………………………………………………………………………………….. 179
MySQL 的客户端 / 服务器通信协议 ……………………………………………………….. 180
查询状态 …………………………………………………………………………………………….. 182
查询优化处理 ………………………………………………………………………………………. 183
查询执行引擎 ………………………………………………………………………………………. 196
将结果返回给客户端 …………………………………………………………………………….. 197
MySQL 查询优化器的局限性 ……………………………………………………………………….. 197
UNION 的限制 …………………………………………………………………………………….. 197
等值传递 …………………………………………………………………………………………….. 198
并行执行 …………………………………………………………………………………………….. 198
在同一个表中查询和更新 ……………………………………………………………………… 198
优化特定类型的查询 …………………………………………………………………………………… 199
优化 COUNT() 查询 ……………………………………………………………………………… 199
优化联接查询 ………………………………………………………………………………………. 201
使用 WITH ROLLUP 优化 GROUP BY …………………………………………………… 201
优化 LIMIT 和 OFFSET 子句 …………………………………………………………………. 202
优化 SQL_CALC_FOUND_ROWS …………………………………………………………. 203
优化 UNION 查询 ………………………………………………………………………………… 204
小结 ………………………………………………………………………………………………………….. 204
第 9 章 复制…………………………………………………………..205
复制概述 ……………………………………………………………………………………………………. 205
复制如何工作 ………………………………………………………………………………………. 207
复制原理 ……………………………………………………………………………………………………. 208
选择复制格式 ………………………………………………………………………………………. 208
全局事务标识符 …………………………………………………………………………………… 208
崩溃后的复制安全 ……………………………………………………………………………….. 210
延迟复制 …………………………………………………………………………………………….. 210
多线程复制………………………………………………………………………………………….. 211
半同步复制………………………………………………………………………………………….. 214
复制过滤器………………………………………………………………………………………….. 214
复制切换 ……………………………………………………………………………………………………. 216
计划内切换………………………………………………………………………………………….. 216
计划外切换………………………………………………………………………………………….. 217
切换时的权衡 ………………………………………………………………………………………. 217
复制拓扑 ……………………………………………………………………………………………………. 217
主动 / 被动模式 ……………………………………………………………………………………. 218
主动 / 只读池模式 ………………………………………………………………………………… 219
不推荐的一些拓扑架构 …………………………………………………………………………. 220
复制管理和维护 ………………………………………………………………………………………….. 223
复制监控 …………………………………………………………………………………………….. 223
观测复制延迟 ………………………………………………………………………………………. 224
确定副本数据的一致性 …………………………………………………………………………. 225
复制问题和解决方案 …………………………………………………………………………………… 226
源端二进制日志损坏 …………………………………………………………………………….. 226
非唯一的服务器 ID ………………………………………………………………………………. 226
未配置服务器 ID ………………………………………………………………………………….. 227
临时表丢失………………………………………………………………………………………….. 227
没有复制所有变更 ……………………………………………………………………………….. 227
复制延迟过大 ………………………………………………………………………………………. 228
来自源服务器的超大数据包 ………………………………………………………………….. 229
磁盘空间耗尽 ………………………………………………………………………………………. 229
复制的限制………………………………………………………………………………………….. 229
小结 ………………………………………………………………………………………………………….. 230
第 10 章 备份与恢复………………………………………………….231
为什么要备份 ………………………………………………………………………………………….. 232
定义恢复需求 …………………………………………………………………………………………. 233
设计 MySQL 备份方案 …………………………………………………………………………….. 234
在线备份还是离线备份 …………………………………………………………………………. 235
逻辑备份还是裸文件备份 ……………………………………………………………………… 236
备份什么 …………………………………………………………………………………………….. 238
增量备份和差异备份 …………………………………………………………………………….. 239
复制 ……………………………………………………………………………………………………. 240
管理和备份二进制日志……………………………………………………………………………… 241
备份和恢复工具 ………………………………………………………………………………………. 241
MySQL Enterprise Backup …………………………………………………………………….. 241
Percona XtraBackup ……………………………………………………………………………… 242
mydumper ……………………………………………………………………………………………. 242
mysqldump ………………………………………………………………………………………….. 242
备份数据 …………………………………………………………………………………………………. 242
逻辑 SQL 备份 …………………………………………………………………………………….. 242
文件系统快照 ………………………………………………………………………………………. 244
Percona XtraBackup ……………………………………………………………………………… 249
从备份中恢复数据 ……………………………………………………………………………………. 252
恢复逻辑备份 ………………………………………………………………………………………. 253
从快照中恢复 ………………………………………………………………………………………. 254
使用 Percona XtraBackup 进行恢复 ………………………………………………………… 255
原始文件恢复后启动 MySQL ………………………………………………………………… 256
小结 ………………………………………………………………………………………………………. 257
第 11 章 扩展 MySQL……………………………………………….258
什么是可扩展性 ……………………………………………………………………………………….. 258
读限制与写限制工作负载 …………………………………………………………………………… 260
理解工作负载 ………………………………………………………………………………………. 260
读限制工作负载 …………………………………………………………………………………… 261
写限制工作负载 …………………………………………………………………………………… 261
功能拆分 ………………………………………………………………………………………………… 262
使用读池扩展读 ……………………………………………………………………………………….. 262
管理读池的配置 …………………………………………………………………………………… 264
读池健康检查 ………………………………………………………………………………………. 265
选择负载均衡器算法 …………………………………………………………………………….. 266
排队机制 ………………………………………………………………………………………. 267
使用分片扩展写 ………………………………………………………………………………….. 268
选择切分方案 ………………………………………………………………………………………. 269
多个分片键………………………………………………………………………………………….. 270
跨分片查询………………………………………………………………………………………….. 271
Vitess ………………………………………………………………………………………………….. 272
ProxySQL ……………………………………………………………………………………………. 275
小结 ………………………………………………………………………………………………. 279
第 12 章 云端的 MySQL…………………………………………….280
托管 MySQL ………………………………………………………………………………… 280
Amazon Aurora for MySQL ……………………………………………………………………. 281
GCP Cloud SQL ……………………………………………………………………………………. 283
虚拟机上的 MySQL …………………………………………………………………………………….. 284
云上的机器类型 …………………………………………………………………………………… 284
选择正确的机器类型 …………………………………………………………………………….. 285
选择正确的磁盘类型 …………………………………………………………………………….. 286
额外的建议………………………………………………………………………………………….. 287
小结 …………………………………………………………………………………………….. 289
第 13 章 MySQL 的合规性………………………………………….291
什么是合规性 ……………………………………………………………………………… 291
服务组织控制类型 2……………………………………………………………………………… 292
萨班斯 – 奥克斯利法案 …………………………………………………………………………. 292
支付卡行业数据安全标准 ……………………………………………………………………… 292
健康保险可携带性和责任法案 ……………………………………………………………….. 292
联邦风险和授权管理计划 ……………………………………………………………………… 293
通用数据保护条例 ……………………………………………………………………………….. 293
Schrems II …………………………………………………………………………………………… 293
建立合规控制体系 ………………………………………………………………………… 294
机密信息管理 ………………………………………………………………………………………. 294
角色与数据分离 …………………………………………………………………………………… 297
跟踪变更 …………………………………………………………………………………………….. 297
备份和恢复过程 …………………………………………………………………………………… 302
小结 ………………………………………………………………………………………………………. 304
附录 A 升级 MySQL…………………………………………………305
附录 B Kubernetes 上的 MySQL…………………………………310