第1 章 MySQL 架构与历史 1" T7 `2 z- C- b' q
1.1 MySQL 逻辑架构 1( `% @4 N( L6 V/ C0 Y7 b6 ?
1.1.1 连接管理与安全性 2
% y, A8 D* F" F9 r1 Z1.1.2 优化与执行 3
/ u# ^2 `" l, e& h9 H U% Q1.2 并发控制 3: L! U1 i5 S) V/ N; n
1.2.1 读写锁 4! d6 ~; q* X* k x/ I1 R
1.2.2 锁粒度 4
- E/ v+ C& n# p1.3 事务 60 p! [6 @& C* e" X
1.3.1 隔离级别 8
0 r1 ~ w2 t" Z! J. r( M' f1.3.2 死锁 9
' M1 Z( _+ v( V4 h( g1.3.3 事务日志 10# e; p2 l; _* X2 i: w/ Y$ a
1.3.4 MySQL 中的事务 10; v, }: n9 w( ~' d
1.4 多版本并发控制 120 _( m2 B8 R. }# Z6 G" A1 w
1.5 MySQL 的存储引擎 13
& Y/ G9 K$ e$ s( I6 \1.5.1 InnoDB 存储引擎 166 m- z% j: P! ]4 |! f, g4 @3 M
1.5.2 MyISAM 存储引擎 17$ `8 U( H- V& v8 P" {% ^
1.5.3 MySQL 内建的其他存储引擎 199 m0 p" K( p8 i$ W0 j T) `% E2 `
1.5.4 第三方存储引擎 22
1 R7 H5 D1 n# I1.5.5 选择合适的引擎 248 _* _! C, [. w! V/ H" ?( A: u: ?
1.5.6 转换表的引擎 27
; O4 d k$ O/ u" @1 y1.6 MySQL 时间线(Timeline) 29
% P- {6 f) `" ]/ x6 B7 X1.7 MySQL 的开发模式 32
; {) O/ ]# Q/ [* c/ p! }1 N: z1.8 总结 33& {2 J" N5 ^1 O# i7 |7 U8 j5 d3 W
第2 章 MySQL 基准测试 359 X3 k/ E G Y* ~* @% g
2.1 为什么需要基准测试 35
5 b d$ K; z/ ]# x9 P* z2.2 基准测试的策略 37
% I" `- G3 i+ O2.2.1 测试何种指标 38% l' [* w7 Q+ \$ O5 N
2.3 基准测试方法 403 y1 Y: @+ G; q0 Z0 l( O6 o5 q
2.3.1 设计和规划基准测试 41
- i; c, t- V1 n; t9 _" O2.3.2 基准测试应该运行多长时间 42' D, V7 Y3 u8 c0 h( ^
2.3.3 获取系统性能和状态 43
, B/ r* ]" N! a% L' Z" D2.3.4 获得准确的测试结果 44- H; Z) Q4 k' u, c" }2 y6 q( E1 T
2.3.5 运行基准测试并分析结果 466 A7 g. G$ z5 {% g0 l1 z6 G
2.3.6 绘图的重要性 47
( T# S: L4 h$ V; H2.4 基准测试工具 49
! j% n d7 |" d) v7 z2.4.1 集成式测试工具 497 E4 s5 j5 s2 d
2.4.2 单组件式测试工具 50+ \% s% U( P0 x4 W% O9 }1 m
2.5 基准测试案例 52) I; Z' I( L/ {) E2 m5 O5 A- u
2.5.1 http_load 53! L' F" X) }/ u7 u' x' {) s' j
2.5.2 MySQL 基准测试套件 .54+ {* ?' G+ H s" M" [
2.5.3 sysbench 55) A Q9 }) N) _- o( K! \% \: f
2.5.4 数据库测试套件中的dbt2 TPC-C 测试 60) ?. ?4 e; @9 @2 v" m2 z
2.5.5 Percona 的TPCC-MySQL 测试工具 63' I: K! e( V0 h" c; T) \
2.6 总结 657 i5 L# o4 K8 j0 O
第3 章 服务器性能剖析 67
* F( ~) n( Y, G @/ w# L3.1 性能优化简介 67
1 Z, n# s. p( o. @0 M/ ]4 D3.1.1 通过性能剖析进行优化 69( J) }: v: i( G' [& O6 @5 p
3.1.2 理解性能剖析 71
( ^: t# b0 e$ N3.2 对应用程序进行性能剖析 72: N4 E2 K: Y- H: ? {% U# F2 u
3.2.1 测量PHP 应用程序 74% ?/ b' [7 ^9 c p- G- j& J
3.3 剖析MySQL 查询 77
( y' y) d" o& T5 @5 C- d3.3.1 剖析服务器负载 772 D7 C+ c( R9 P5 O
3.3.2 剖析单条查询 81
1 h% d9 X) l4 H+ t, R# K3.3.3 使用性能剖析 87+ Q5 Q+ {# G- ~5 C
3.4 诊断间歇性问题 88
) H2 A+ P1 j6 l3.4.1 单条查询问题还是服务器问题 89
$ l% x$ d8 S) }, I, \- s% H3.4.2 捕获诊断数据 93, T; `5 @" X6 ^$ s$ h! q) B; T# f
3.4.3 一个诊断案例 98
$ |% Z. ^% G6 |8 t1 \3.5 其他剖析工具 106
) g6 |4 d: B: u9 k# p, a% Z3.5.1 使用USER_STATISTICS 表 106
$ b! `' p0 W! ]; b; F( Y3.5.2 使用strace 107
6 z9 o# K( l- [2 L( W3.6 总结 1080 v1 ~+ |4 a% c8 \; m
第4 章 Schema 与数据类型优化 111
4 w& t/ W# ^* o4 d- y7 g3 H4.1 选择优化的数据类型 111
1 J+ y9 F+ J. @# R, a2 p/ L& L2 V4.1.1 整数类型 113
6 `, \: c/ H4 [1 }: I& F4.1.2 实数类型 113# q) K+ D% v9 Z* i1 C9 G
4.1.3 字符串类型 114
. F9 Z M4 F3 @ d6 T4.1.4 日期和时间类型 121! K/ D, ^* T7 y, g' e- n8 d
4.1.5 位数据类型 1232 l, \1 `; P) l4 n; f. V
4.1.6 选择标识符(identifier) 125" I. `! t* y: c
4.1.7 特殊类型数据 127
% r* s- \/ n1 ?$ I: o4.2 MySQL schema 设计中的陷阱 127
) ]6 E3 [9 s* A. E5 Q& h4.3 范式和反范式 1290 Q( F/ Q" \0 k3 H- V
4.3.1 范式的优点和缺点 130
1 C2 s, B# d! L+ K% b/ z4.3.2 反范式的优点和缺点 . 130
, e& Y( W& @% j2 p4.3.3 混用范式化和反范式化 131
# C! u1 V9 o* I7 ]8 D" D; w( l4.4 缓存表和汇总表 132
4 F$ }6 p- ]+ o( I7 _7 D9 o* |4.4.1 物化视图 134# H* V- Q4 d M) [5 K
4.4.2 计数器表 135
: t! b; Z! s) G4 P4.5 加快ALTER TABLE 操作的速度 136) y; J' K- u4 G& A
4.5.1 只修改.frm 文件 137
7 l B1 y) b9 K4.5.2 快速创建MyISAM 索引 139# @; W" f# S+ p) g* q& R6 h( Q
4.6 总结 140
& o- y) N- _1 G. G第5 章 创建高性能的索引 141; i$ c6 V7 {/ `1 }$ s" U
5.1 索引基础 141
( d7 [4 A* V- e$ y5.1.1 索引的类型 142, f4 R; [) Q$ o5 x' a
5.2 索引的优点 1528 H) X# t' x, k% g0 Y* j+ O: D
5.3 高性能的索引策略 1536 f, R y$ o# J+ L
5.3.1 独立的列 153
2 G: |3 `0 x5 E5 J4 C2 r# T0 T5.3.2 前缀索引和索引选择性 153
0 V. ^5 l: _' |& n0 X) ~& [5.3.3 多列索引 157
6 X* {6 y& c: p' P5.3.4 选择合适的索引列顺序 159
8 e" [8 b; ^; ]+ V4 R: n7 ~5.3.5 聚簇索引 162" U3 G, g7 C3 l$ z( z$ Q
5.3.6 覆盖索引 171
( s- {7 P( E! {3 ^; T5.3.7 使用索引扫描来做排序 175
) s* J4 O0 D; g5.3.8 压缩(前缀压缩)索引 177# M( d# k4 E0 X, ~# q: ^7 n+ ~
5.3.9 冗余和重复索引 178
& `( F8 E/ M" l+ J5.3.10 未使用的索引 181$ z- Z3 w! {, t
5.3.11 索引和锁 1810 w, _! K- t# s$ O
5.4 索引案例学习 183) J) ^9 m( d5 Z# w" l
5.4.1 支持多种过滤条件 183
% k+ E2 d9 h: e' E7 n* M" b7 u; [5.4.2 避免多个范围条件 185
5 T# |* F& g2 |3 ?5.4.3 优化排序 186
K4 n' B9 B6 [, S8 Y6 s- M5.5 维护索引和表 187
) a1 O' H! e+ o# a6 Z J$ h( O5.5.1 找到并修复损坏的表 . 187
: p8 [% q3 b! h5.5.2 更新索引统计信息 188
: S( `( a1 n$ M$ @) q' m5.5.3 减少索引和数据的碎片 190
, \, j5 S. h) h6 x2 W, x5.6 总结 192
$ {/ D1 K& ?( w6 o第6 章 查询性能优化 195% J7 L9 V6 l K' T- w0 j
6.1 为什么查询速度会慢 195
3 h" l6 B! n1 n+ N) S* o: V6.2 慢查询基础:优化数据访问 196
# O! z5 O" g6 W2 S2 r5 w6.2.1 是否向服务器请求了不需要的数据 196
$ a5 Z" W V9 Y* {6 i u6.2.2 MySQL 是否在扫描额外的记录 1984 q* ~* G" D( a" I" K% C" n5 z5 @/ q
6.3 重构查询的方式 201
. E( H3 G, Q" X. K3 k7 q# j+ l4 Y4 }6.3.1 一个复杂查询还是多个简单查询 201! y: f! N6 l! B
6.3.2 切分查询 202
, {8 h% O5 [/ K5 c% Y/ @* A6.3.3 分解关联查询 203
7 [) \; h8 o# c) c- L8 L4 j6.4 查询执行的基础 204
& D7 O: W1 B/ C# h0 C* T6.4.1 MySQL 客户端/ 服务器通信协议 2052 Q3 E8 v- G8 _# e* }: i
6.4.2 查询缓存 208
, S! G7 k( g3 H6 Y8 g& r/ {9 S6.4.3 查询优化处理 208
4 a3 |/ m4 _0 p& H) C0 s6.4.4 查询执行引擎 222
3 ?; \; c7 B3 f6.4.5 返回结果给客户端 2236 C6 b2 r6 |4 O" S0 x/ w
6.5 MySQL 查询优化器的局限性 223; q3 d B! X% d$ `/ I
6.5.1 关联子查询 223
" Z; \; U: `) G9 ~8 }6.5.2 UNION 的限制 228
( \7 s7 N9 P4 {- X P2 ^6.5.3 索引合并优化 228
4 D% e- j8 C2 R6 h& c# M3 }# u6.5.4 等值传递 229
% Q) K) {' x; I$ I) [. y$ j6.5.5 并行执行 229
6 Z0 F% ]6 c/ B3 y& N' j6.5.6 哈希关联 229/ [) G/ ?+ J& s$ L) C
6.5.7 松散索引扫描 229
9 K( v5 F7 a. f: B" ~, T5 H2 ^6.5.8 值和小值优化 . 2319 N+ d' t2 b- a+ H
6.5.9 在同一个表上查询和更新 232
: ~& w, I7 y" s1 U! f( g) b! I6.6 查询优化器的提示(hint) 232
4 G# E7 ~* S9 @) Q2 D6.7 优化特定类型的查询 2364 e' e# \, Y1 N' g$ a
6.7.1 优化COUNT() 查询 236
) Z' x9 `7 c8 Y) p: @# I6.7.2 优化关联查询 239
: ]5 C, B. y6 X; e! v Y6.7.3 优化子查询 2398 Q8 D; ] [9 _( D
6.7.4 优化GROUP BY 和DISTINCT 239
" }4 X6 c |4 T6 F; X6.7.5 优化LIMIT 分页 241
" q$ { M0 b3 c2 ~3 g# L6.7.6 优化SQL_CALC_FOUND_ROWS 243
% I. Q! |5 n9 f }! @8 g( |) q6.7.7 优化UNION 查询 243
( {9 \* c' O. Q" i5 d3 a6.7.8 静态查询分析 2445 `& E2 N. \4 c$ H5 y) }
6.7.9 使用用户自定义变量 . 244, v, E; ^* m3 m: ]' D: H/ P
6.8 案例学习 251
% Z& H0 ?7 Q4 m2 \9 x3 s8 L6.8.1 使用MySQL 构建一个队列表 2513 S6 W0 W/ _$ _% l7 { q
6.8.2 计算两点之间的距离 . 254
|$ v5 c5 r# K; h! g$ s6.8.3 使用用户自定义函数 . 257+ d; O k3 [7 `% g/ G
6.9 总结 258
; }7 D- O a' Y9 A+ S第7 章 MySQL 高级特性 2591 j) b$ f! N& o& q# _# J
7.1 分区表 2596 d8 D' V9 T2 W# d4 c8 v% [4 L2 Q
7.1.1 分区表的原理 2608 s# v# w) B/ V5 w
7.1.2 分区表的类型 261
2 Z! |6 X/ l5 a( z8 M& v [7.1.3 如何使用分区表 262
6 h" V- c9 \- _1 i! F7.1.4 什么情况下会出问题 . 263
7 a( q" e7 V1 ^3 Q7.1.5 查询优化 266
$ W0 j: Y. q6 D9 h# A3 w+ n# N7.1.6 合并表 267
; Z; ~( f" m) v9 y W; j7.2 视图 270# S' d Z! @$ g1 `8 k. s# D
7.2.1 可更新视图 2728 y1 c- p+ i: j' `, X
7.2.2 视图对性能的影响 273
$ ^6 b2 D6 B/ S) f) t4 r7.2.3 视图的限制 274; } J b1 G4 K7 X1 e* E" }/ ~9 _, v
7.3 外键约束 275
8 S+ g5 {3 u& W9 z4 ], x& ~' H8 }7.4 在MySQL 内部存储代码 276
* F# T% k$ p4 n( s7 ?7.4.1 存储过程和函数 278
! T' t3 d; L) ^7.4.2 触发器 279
6 b. Z. v) Z9 I1 t- O- p7.4.3 事件 281 u9 I, z2 K: H- @ a/ B
7.4.4 在存储程序中保留注释 283
# }7 G" G# F r l6 g7.5 游标 283* L. \2 z2 j7 H" J5 l# L( b8 s6 e
7.6 绑定变量 284
9 K( a X8 w& E8 Y7.6.1 绑定变量的优化 286
; g- F$ a4 [2 U2 Q7.6.2 SQL 接口的绑定变量 286
5 W# \4 P' U$ v' Z# _7.6.3 绑定变量的限制 288
. x, g+ Q7 W s6 w4 @7.7 用户自定义函数 289* d5 }. k+ s+ B* v2 O& Q: L' _9 ~
7.8 插件 290
9 F% g/ y& l/ r7.9 字符集和校对 2912 O: m: r- z& C! a& j
7.9.1 MySQL 如何使用字符集 292
+ `7 F6 S( w, t5 s4 n( b5 N' c. k; D7.9.2 选择字符集和校对规则 295
2 W: ?6 N; M+ T. B# j7.9.3 字符集和校对规则如何影响查询 296) @( o5 R; L2 Z. b K7 L
7.10 全文索引 2993 T/ j3 k) r0 \; r
7.10.1 自然语言的全文索引 3000 e P; k8 D8 C* k& n
7.10.2 布尔全文索引 302
/ p' m$ i) h8 m, V* w" t7.10.3 MySQL5.1 中全文索引的变化 303
9 ]+ k" A( T) @7.10.4 全文索引的限制和替代方案 304+ s2 d$ b# V, k7 N/ f3 M: x4 Q6 M
7.10.5 全文索引的配置和优化 306; u# X$ t, T: J/ Y
7.11 分布式(XA)事务 307
" K) w* ^3 I" ]6 `5 `7.11.1 内部XA 事务 307$ B8 r0 h+ }! A
7.11.2 外部XA 事务 308
. S0 |& ^! m6 D+ f& x T7.12 查询缓存 309
! P1 e: E( M. I7 [: H4 V4 w& k# {7.12.1 MySQL 如何判断缓存命中 309% w% {" L a2 d* P4 h# ^: v3 w
7.12.2 查询缓存如何使用内存 311, v. J# K( v2 {
7.12.3 什么情况下查询缓存能发挥作用 313
" z N& H& n; t- `) A7.12.4 如何配置和维护查询缓存 316# F! g6 w/ {2 V) b! P- X: @0 C) Z
7.12.5 InnoDB 和查询缓存 . 319
) x& t$ M! U U1 T5 B7.12.6 通用查询缓存优化 320
" R M S7 ?$ T7.12.7 查询缓存的替代方案 321) y' X) P7 T- N& L* F
7.13 总结 321
; G2 G1 M9 {, W0 u L7 ^第8 章 优化服务器设置 325. O0 v7 l/ U* M8 O
8.1 MySQL 配置的工作原理 326% z) p+ W: [) B1 V7 e5 c
8.1.1 语法、作用域和动态性 327
' }, v1 ]- m f. G* [" n8.1.2 设置变量的副作用 328
: B; D, i& s+ Y, X$ L. W8.1.3 入门 331
; O" k# p* A6 R7 [; I5 Q8.1.4 通过基准测试迭代优化 332: K2 k! o2 g, e* u- ~' C! Z
8.2 什么不该做 333
1 {# y8 t/ X/ o) J8.3 创建MySQL 配置文件 335' v% T/ s0 G! m7 v
8.3.1 检查MySQL 服务器状态变量 339
' u1 M5 |- D; ]8.4 配置内存使用 340$ _5 g" z8 o0 k2 Y% f" R
8.4.1 MySQL 可以使用多少内存? 3408 [0 N, u7 B+ _+ `0 k
8.4.2 每个连接需要的内存 . 341* [) B: }5 ?4 Q M; ~* @
8.4.3 为操作系统保留内存 . 341, K0 K9 m. E) Q. O- z
8.4.4 为缓存分配内存 342: j; U h4 r$ B1 Y0 V/ n
8.4.5 InnoDB 缓冲池(Buffer Pool) 342
. r0 p2 B, ]5 T$ |, ^* [" z8.4.6 MyISAM 键缓存(Key Caches) 344. h6 e" n! p- v7 A
8.4.7 线程缓存 3460 d0 W; A* ?+ v. Q
8.4.8 表缓存(Table Cache) 3477 \( T6 t8 ]5 O1 h2 o" t3 G2 \( z1 x) S
8.4.9 InnoDB 数据字典(Data Dictionary) 3484 c/ u* A0 R! k
8.5 配置MySQL 的I/O 行为 349
; v. d: c" } w/ R. w0 @9 x' p8.5.1 InnoDB I/O 配置 349
3 U3 g' p5 i4 ?' D/ T9 w2 `8.5.2 MyISAM 的I/O 配置 . 361+ W2 I/ o1 m8 K: d& f
8.6 配置MySQL 并发 . 3631 k' q, |. E2 ^0 R( G& T' V% \
8.6.1 InnoDB 并发配置 364
6 k( \; ]3 L3 ^" m2 R5 r8.6.2 MyISAM 并发配置 365
- C, I& U3 e3 K2 A+ {/ \; L8.7 基于工作负载的配置 366
. R0 [9 [% U6 x! j3 t8.7.1 优化BLOB 和TEXT 的场景 367, S/ @: L, T% m, O! b" t1 ^
8.7.2 优化排序(Filesorts). 368$ Q B' K( i9 m+ \; }3 `) i
8.8 完成基本配置 369
$ E" c( H6 J2 X9 `& y, k+ x8.9 安全和稳定的设置 371) C0 K w3 j+ B. K' x( F
8.10 高级InnoDB 设置 374
* k, |+ |/ W) S9 R- f* a8.11 总结 376( j6 b6 w) y5 L7 L8 S1 I
第9 章 操作系统和硬件优化 377
/ D w) B* \: k, P( W$ g6 W( g# R6 ^9.1 什么限制了MySQL 的性能 3773 {9 |( v5 N0 C1 f
9.2 如何为MySQL 选择CPU 378
6 L2 R4 S% y% Q6 n. \! i9.2.1 哪个更好:更快的CPU 还是更多的CPU 378
5 M0 d+ v' p, ~2 e4 T' @& b9.2.2 CPU 架构 3805 G# W$ j- [5 e n w& I
9.2.3 扩展到多个CPU 和核心 381
, g# g, F. }- @; }( G9.3 平衡内存和磁盘资源 382
) [5 b# Q+ @- N# U5 l: u9.3.1 随机I/O 和顺序I/O 3831 S {/ M7 ?5 `* e" O: e: [
9.3.2 缓存,读和写 384
! r5 N4 m4 J: \5 y7 O+ K2 q3 u9.3.3 工作集是什么 385
- N _! i9 a! c. v7 l z9.3.4 找到有效的内存/ 磁盘比例 3861 f( T$ s+ e1 Q0 z6 I
9.3.5 选择硬盘 387
6 t+ h0 O6 B/ U v9.4 固态存储 389
+ _0 S& E: @7 f: |* `" h9.4.1 闪存概述 390% X* }& @( p3 j* S! N+ a; _
9.4.2 闪存技术 391
$ N5 j1 r+ f+ ]- l7 ~& h1 a9.4.3 闪存的基准测试 392
5 W/ w r% A' h$ @: ?9.4.4 固态硬盘驱动器(SSD) 3930 } N) C* s# x2 T2 @8 j
9.4.5 PCIe 存储设备 3950 J) L+ Q, D s: [4 I: B$ B
9.4.6 其他类型的固态存储 . 396 x( y7 M/ ^) F* U; m+ X! V
9.4.7 什么时候应该使用闪存 3960 U* j' Q0 ~% ~( e- G& C4 z
9.4.8 使用Flashcache 3976 h& D4 d3 S( Q$ I; `% O2 }
9.4.9 优化固态存储上的MySQL 399
2 ^( }5 M$ |7 ?0 U S2 H9.5 为备库选择硬件 4021 A- n# e8 T7 {; {9 ^
9.6 RAID 性能优化 403
5 v, T5 k* `5 T! z* {9.6.1 RAID 的故障转移、恢复和镜像 405
; C5 m% W, l; l, i2 P, |9.6.2 平衡硬件RAID 和软件RAID 406
' P6 d( E$ Y6 i. @1 E9.6.3 RAID 配置和缓存 407
- _" ^( K$ f# X, t9.7 SAN 和NAS 410
) T0 K. E1 V0 w9.7.1 SAN 基准测试 411
8 u# [" ]0 L( K2 j0 A4 x B }$ ~ P