一、目录介绍
第1章 MySQL架构与历史
1.1 MySQL逻辑架构1
1.1.1 连接管理与安全性2
1.1.2 优化与执行3
1.2 并发控制3
1.2.1 读写锁4
1.2.2 锁粒度4
1.3 事务6
1.3.1 隔离级别8
1.3.2 死锁9
1.3.3 事务日志10
1.3.4 MySQL中的事务10
1.4 多版本并发控制12
1.5 MySQL的存储引擎13
1.5.1 InnoDB存储引擎16
1.5.2 MyISAM存储引擎17
1.5.3 MySQL内建的其他存储引擎19
1.5.4 第三方存储引擎22
1.5.5 选择合适的引擎24
1.5.6 转换表的引擎27
1.6 MySQL时间线(Timeline)29
1.7 MySQL的开发模式32
1.8 总结33
第2章 MySQL基准测试
2.1 为什么需要基准测试35
2.2 基准测试的策略37
2.2.1 测试何种指标38
2.3 基准测试方法40
2.3.1 设计和规划基准测试41
2.3.2 基准测试应该运行多长时间42
2.3.3 获取系统性能和状态43
2.3.4 获得准确的测试结果44
2.3.5 运行基准测试并分析结果46
2.3.6 绘图的重要性47
2.4 基准测试工具49
2.4.1 集成式测试工具49
2.4.2 单组件式测试工具50
2.5 基准测试案例52
2.5.1 http_load53
2.5.2 MySQL基准测试套件54
2.5.3 sysbench55
2.5.4 数据库测试套件中的dbt2TPC—C测试60
2.5.5 Percona的TPCC—MySQL测试工具63
2.6 总结65
第3章 服务器性能剖析
3.1 性能优化简介67
3.1.1 通过性能剖析进行优化69
3.1.2 理解性能剖析71
3.2 对应用程序进行性能剖析72
3.2.1 测量PHP应用程序74
3.3 剖析MySQL查询77
3.3.1 剖析服务器负载77
3.3.2 剖析单条查询81
3.3.3 使用性能剖析87
3.4 诊断间歇性问题88
3.4.1 单条查询问题还是服务器问题89
3.4.2 捕获诊断数据93
3.4.3 一个诊断案例98
3.5 其他剖析工具106
3.5.1 使用USER_STATISTICS表106
3.5.2 使用strace107
3.6 总结108
第4章 Schema与数据类型优化
4.1 选择优化的数据类型111
4.1.1 整数类型113
4.1.2 实数类型113
4.1.3 字符串类型114
4.1.4 日期和时间类型121
4.1.5 位数据类型123
4.1.6 选择标识符(identifier)125
4.1.7 特殊类型数据127
4.2 MySQLschema设计中的陷阱127
4.3 范式和反范式129
4.3.1 范式的优点和缺点130
4.3.2 反范式的优点和缺点130
4.3.3 混用范式化和反范式化131
4.4 缓存表和汇总表132
4.4.1 物化视图134
4.4.2 计数器表135
4.5 加快ALTERTABLE操作的速度136
4.5.1 只修改.frm文件137
4.5.2 快速创建MyISAM索引139
4.6 总结140
第5章 创建高性能的索引
5.1 索引基础141
5.1.1 索引的类型142
5.2 索引的优点152
5.3 高性能的索引策略153
5.3.1 独立的列153
5.3.2 前缀索引和索引选择性153
5.3.3 多列索引157
5.3.4 选择合适的索引列顺序159
5.3.5 聚簇索引162
5.3.6 覆盖索引171
5.3.7 使用索引扫描来做排序175
5.3.8 压缩(前缀压缩)索引177
5.3.9 冗余和重复索引178
5.3.10 未使用的索引181
5.3.11 索引和锁181
5.4 索引案例学习183
5.4.1 支持多种过滤条件183
5.4.2 避免多个范围条件185
5.4.3 优化排序186
5.5 维护索引和表187
5.5.1 找到并修复损坏的表187
5.5.2 更新索引统计信息188
5.5.3 减少索引和数据的碎片190
5.6 总结192
第6章 查询性能优化
6.1 为什么查询速度会慢195
6.2 慢查询基础:优化数据访问196
6.2.1 是否向服务器请求了不需要的数据196
6.2.2 MySQL是否在扫描额外的记录198
6.3 重构查询的方式201
6.3.1 一个复杂查询还是多个简单查询201
6.3.2 切分查询202
6.3.3 分解关联查询203
6.4 查询执行的基础204
6.4.1 MySQL客户端/服务器通信协议205
6.4.2 查询缓存208
6.4.3 查询优化处理208
6.4.4 查询执行引擎222
6.4.5 返回结果给客户端223
6.5 MySQL查询优化器的局限性223
6.5.1 关联子查询223
6.5.2 UNION的限制228
6.5.3 索引合并优化228
6.5.4 等值传递229
6.5.5 并行执行229
6.5.6 哈希关联229
6.5.7 松散索引扫描229
6.5.8 最大值和最小值优化231
6.5.9 在同一个表上查询和更新232
6.6 查询优化器的提示(hint)232
6.7 优化特定类型的查询236
6.7.1 优化COUNT()查询236
6.7.2 优化关联查询239
6.7.3 优化子查询239
6.7.4 优化GROUPBY和DISTINCT239
6.7.5 优化LIMIT分页241
6.7.6 优化SQL_CALC_FOUND_ROWS243
6.7.7 优化UNION查询243
6.7.8 静态查询分析244
6.7.9 使用用户自定义变量244
6.8 案例学习251
6.8.1 使用MySQL构建一个队列表251
6.8.2 计算两点之间的距离254
6.8.3 使用用户自定义函数257
6.9 总结258
第7章 MySQL高级特性
7.1 分区表259
7.1.1 分区表的原理260
7.1.2 分区表的类型261
7.1.3 如何使用分区表262
7.1.4 什么情况下会出问题263
7.1.5 查询优化266
7.1.6 合并表267
7.2 视图270
7.2.1 可更新视图272
7.2.2 视图对性能的影响273
7.2.3 视图的限制274
7.3 外键约束275
7.4 在MySQL内部存储代码276
7.4.1 存储过程和函数278
7.4.2 触发器279
7.4.3 事件281
7.4.4 在存储程序中保留注释283
7.5 游标283
7.6 绑定变量284
7.6.1 绑定变量的优化286
7.6.2 SQL接口的绑定变量286
7.6.3 绑定变量的限制288
7.7 用户自定义函数289
7.8 插件290
7.9 字符集和校对291
7.9.1 MySQL如何使用字符集292
7.9.2 选择字符集和校对规则295
7.9.3 字符集和校对规则如何影响查询296
7.10 全文索引299
7.10.1 自然语言的全文索引300
7.10.2 布尔全文索引302
7.10.3 MySQL5.1中全文索引的变化303
7.10.4 全文索引的限制和替代方案304
7.10.5 全文索引的配置和优化306
7.11 分布式(XA)事务307
7.11.1 内部XA事务307
7.11.2 外部XA事务308
7.12 查询缓存309
7.12.1 MySQL如何判断缓存命中309
7.12.2 查询缓存如何使用内存311
7.12.3 什么情况下查询缓存能发挥作用313
7.12.4 如何配置和维护查询缓存316
7.12.5 InnoDB和查询缓存319
7.12.6 通用查询缓存优化320
7.12.7 查询缓存的替代方案321
7.13 总结321
第8章 优化服务器设置325
第9章 操作系统和硬件优化377
第10章 复制433
第11章 可扩展的MySQL501
第12章 高可用性543
第13章 云端的MySQL563
第14章 应用层优化577
第15章 备份与恢复593
第16章 MySQL用户工具635
附录AMySQL分支与变种649
附录BMySQL服务器状态655
附录C大文件传输683
附录DEXPLAIN687
附录E锁的调试703
附录F在MySQL上使用Sphinx713
索引739
��