“只要你不敢以MySQL专家自诩,又岂敢错过这本神书?”“一言以蔽之,写得好,编排得好,需要参考时容易到爆!”“我可是从头到尾看了一遍上一版,可还是毫不犹豫拿起了这本《高性能MySQL(第3版)》,而且看完后一点都不后悔……”
《高性能MySQL(第3版)》是MySQL 领域的经典之作,拥有广泛的影响力。第3 版更新了大量的内容,不但涵盖了MySQL5.5版本的新特性,也讲述了关于固态盘、高可扩展性设计和云计算环境下的数据库相关的新内容,原有的基准测试和性能优化部分也做了大量的扩展和补充。全书共分为16章和6 个附录,内容涵盖MySQL架构和历史,基准测试和性能剖析,数据库软硬件性能优化,复制、备份和恢复,高可用与高可扩展性,以及云端的MySQL和MySQL相关工具等方面的内容。每一章都是相对独立的主题,读者可以有选择性地单独阅读。
《高性能MySQL(第3版)》不但适合数据库管理员(DBA)阅读,也适合开发人员参考学习。不管是数据库新手还是专家,相信都能从本书有所收获。
第一个趋势,采用了InnoDB plugin的版本,在高并发的时候性能明显更好,可以说InnoDB plugin的扩展性更好。这是可以预期的结果,旧的版本在高并发时确实存在问题。第二个趋势,新的版本在单线程的时候性能比旧版本更差。一开始可能无法理解为什么会这样,仔细想想就能明白,这是一个非常简单的只读测试。新版本的SQL语法更复杂,针对复杂查询增加了很多特性和改进,这对于简单查询可能带来了更多的开销。旧版本的代码简单,对于简单的查询反而会更有利。原计划做一个更复杂的不同并发条件下的读写混合场景的测试(类似TPC—C),但要在不同版本间做到可比较基本是不可能的。一般来说,新版本在复杂场景时性能有更多的优化,尤其是高并发和大数据集的情况下。
那么该如何选择版本呢?这更多地取决于业务需求而不是技术需求。理想情况下当然是版本越新越好,当然也可以选择等到第一个bug修复版本以后再采用新的大版本。如果应用还没有上线,也可以采用即将发布的新版本,以尽可能地延迟应用上线后的升级操作。
1.7 MySQL的开发模式
MySQL的开发过程和发布模型在不同的阶段有很大的变化,但目前已经基本稳定下来。在Oracle定期发布的新里程碑开发版本中,会包含即将在下一个GA版本发布的新特性。这样做是为了测试和获得反馈,请不要在生产环境使用此版本,虽然Oracle宣称每个里程碑版本的质量都是可靠的,并随时可以正式发布(到目前为止也没有任何理由去推翻这个说法)。Oracle也会定期发布实验室预览版,主要包含一些特定的需要评估的特性,这些特性并不保证会在下一个正式版本中包括进去。最终,Oracle会将稳定的特性打包发布一个新的GA版本。
MySQL依然遵循GPL开源协议,全部的源代码(除了一些商业版本的插件)都会开放给社区。Oracle似乎也理解,为社区和付费用户提供不同的版本并非明智之举。MySQLAB曾经尝试过不同版本的策略,结果导致付费用户变成了“睁眼瞎”,无法从社区的测试和反馈中获得好处。不同版本的策略并不受企业用户的欢迎,所以后来被Sun废除了。现在Oracle为付费用户单独提供了一些服务器插件,而MySQL本身还是遵循开源模式。尽管对于私有的服务器插件的发布有一些抱怨,但这只是少数的声音,并且慢慢地在平息。
……
推荐序
前言
第1章 MySQL 架构与历史
1.1 MySQL 逻辑架构
1.1.1 连接管理与安全性
1.1.2 优化与执行
1.2 并发控制
1.2.1 读写锁
1.2.2 锁粒度
1.3 事务
1.3.1 隔离级别
1.3.2 死锁
1.3.3 事务日志
1.3.4 MySQL 中的事务
1.4 多版本并发控制
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 的开发模式
1.8 总结
第2章 MySQL 基准测试
2.1 为什么需要基准测试
2.2 基准测试的策略
2.2.1 测试何种指标
2.3 基准测试方法
2.3.1 设计和规划基准测试
2.3.2 基准测试应该运行多长时间
2.3.3 获取系统性能和状态
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 性能优化简介
3.1.1 通过性能剖析进行优化
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 与数据类型优化
4.1 选择优化的数据类型
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 范式的优点和缺点
4.3.2 反范式的优点和缺点
4.3.3 混用范式化和反范式化
4.4 缓存表和汇总表
4.4.1 物化视图
4.4.2 计数器表
4.5 加快ALTER TABLE 操作的速度
4.5.1 只修改.frm 文件
4.5.2 快速创建MyISAM 索引
4.6 总结
第5章 创建高性能的索引
5.1 索引基础
5.1.1 索引的类型
5.2 索引的优点
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 优化排序
5.5 维护索引和表
5.5.1 找到并修复损坏的表
5.5.2 更新索引统计信息
5.5.3 减少索引和数据的碎片
5.6 总结
第6章 查询性能优化
6.1 为什么查询速度会慢
6.2 慢查询基础:优化数据访问
6.2.1 是否向服务器请求了不需要的数据
6.2.2 MySQL 是否在扫描额外的记录
6.3 重构查询的方式
6.3.1 一个复杂查询还是多个简单查询
6.3.2 切分查询
6.3.3 分解关联查询
6.4 查询执行的基础
6.4.1 MySQL 客户端/ 服务器通信协议
6.4.2 查询缓存
6.4.3 查询优化处理
6.4.4 查询执行引擎
6.4.5 返回结果给客户端
6.5 MySQL 查询优化器的局限性
6.5.1 关联子查询
6.5.2 UNION 的限制
6.5.3 索引合并优化
6.5.4 等值传递
6.5.5 并行执行
6.5.6 哈希关联
6.5.7 松散索引扫描
6.5.8 最大值和最小值优化
6.5.9 在同一个表上查询和更新
6.6 查询优化器的提示(hint)
6.7 优化特定类型的查询
6.7.1 优化COUNT() 查询
6.7.2 优化关联查询
6.7.3 优化子查询
6.7.4 优化GROUP BY 和DISTINCT
6.7.5 优化LIMIT 分页
6.7.6 优化SQL_CALC_FOUND_ROWS
6.7.7 优化UNION 查询
6.7.8 静态查询分析
6.7.9 使用用户自定义变量
6.8 案例学习
6.8.1 使用MySQL 构建一个队列表
6.8.2 计算两点之间的距离
6.8.3 使用用户自定义函数
6.9 总结
第7章 MySQL 高级特性
7.1 分区表
7.1.1 分区表的原理
7.1.2 分区表的类型
7.1.3 如何使用分区表
7.1.4 什么情况下会出问题
7.1.5 查询优化
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 触发器
7.4.3 事件
7.4.4 在存储程序中保留注释
7.5 游标
7.6 绑定变量
7.6.1 绑定变量的优化
7.6.2 SQL 接口的绑定变量
7.6.3 绑定变量的限制
7.7 用户自定义函数
7.8 插件
7.9 字符集和校对
7.9.1 MySQL 如何使用字符集
7.9.2 选择字符集和校对规则
7.9.3 字符集和校对规则如何影响查询
7.10 全文索引
7.10.1 自然语言的全文索引
7.10.2 布尔全文索引
7.10.3 MySQL5.1 中全文索引的变化
7.10.4 全文索引的限制和替代方案
7.10.5 全文索引的配置和优化
7.11 分布式(XA)事务
7.11.1 内部XA 事务
7.11.2 外部XA 事务
7.12 查询缓存
7.12.1 MySQL 如何判断缓存命中
7.12.2 查询缓存如何使用内存
7.12.3 什么情况下查询缓存能发挥作用
7.12.4 如何配置和维护查询缓存
7.12.5 InnoDB 和查询缓存
7.12.6 通用查询缓存优化
7.12.7 查询缓存的替代方案
7.13 总结
第8章 优化服务器设置
8.1 MySQL 配置的工作原理
8.1.1 语法、作用域和动态性
8.1.2 设置变量的副作用
8.1.3 入门
8.1.4 通过基准测试迭代优化
8.2 什么不该做
8.3 创建MySQL 配置文件
8.3.1 检查MySQL 服务器状态变量
8.4 配置内存使用
8.4.1 MySQL 可以使用多少内存?
8.4.2 每个连接需要的内存
8.4.3 为操作系统保留内存
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 并发
8.6.1 InnoDB 并发配置
8.6.2 MyISAM 并发配置
8.7 基于工作负载的配置
8.7.1 优化BLOB 和TEXT 的场景
8.7.2 优化排序(Filesorts)
8.8 完成基本配置
8.9 安全和稳定的设置
8.10 高级InnoDB 设置
8.11 总结
第9章 操作系统和硬件优化
第10章 复制
第11章 可扩展的MySQL
第12章 高可用性
第13章 云端的MySQL
第14章 应用层优化
第15章 备份与恢复
第16章 MySQL 用户工具
附录A MySQL 分支与变种
附录B MySQL 服务器状态
附录C 大文件传输
附录D EXPLAIN
附录E 锁的调试
附录F 在MySQL 上使用Sphinx
索引
★每一章均别具匠心,力求理论与实践的精确平衡,且布满无价之宝,有时甚至越过MySQL舞台,完全适用于任一数据库。其中第二章“MySQL基准测试”及第3章“服务器性能剖析”是非常必要的基础,推荐提前阅读。
纵观全书,作者推荐的工具、实战案例及经验过的诊断技术,可大大提高你的性能急救技能,以及加深对MySQL本质的理解。然而,本书值得推崇的,还是其在探讨性能的同时,将数据库结构的客观方面纳入思考,这是其他书里难以看到的。此外,增补的MySQL高可用性及云特性,也让人更加欣喜。
相信不少人会因为找不到某些书中引用的资料或工具而苦恼,但从本书中按图索骥,会发现这些东西正是作者对MySQL社区的杰出贡献,也就是说,你可以直接用这些工具!
很多年前我就是这本书的“粉丝”了,这是一本伟大的书,第三版尤其如此。这些世界级的专家不仅仅分享他们的专业知识,也花了很多时间来更新和添加新的章节,且都是高品质的内容。本书有大量关于如何获得MySQL高性能的细节信息,并且关注的是提升性能的过程,而不仅仅是描述事实结果和琐碎的细枝末节。这本书将告诉读者如何将事情做得更好,不管MySQL在不同版本中的行为有多么大的改变。
毫无疑问,本书的作者是有资格来写这么一本书的人,他们经验丰富,有合理的方法,关注效率,并且精益求精。说到经验丰富,本书的作者已经在MySQL性能领域工作多年,从MySQL还没有什么可扩展性和可测量性的时代,直到现在这些方面已经有了长足的进步。而说到合理的方法,他们简直把这件事情当成了科学,首先定义需要解决的问题,然后通过合理的猜测和精确的测量来解决问题。
我对作者在效率方面的关注尤其印象深刻。作为顾问,他们时间宝贵。客户是按照他们的时间付费的,所以都希望能更快地解决问题。所以本书作者定义了一整套的流程,开发了很多的工具,让事情变得正确和高效。在本书中,作者详细描述了这些流程,并且发布了工具的源代码。
最后,本书作者在工作上一直精益求精。比如从吞吐量到响应时间的关注,致力于了解MySQL在新硬件上的性能表现,追求新的技能如排队理论对性能的影响,等等。我相信本书预示了MySQL的光明前景。MySQL已经支持高要求的工作负载,本书作者也在努力提升MySQL社区内对性能的认识。同时,他们还直接为性能提升做出了贡献,包括XtraDB和XtraBackup。一直以来我从他们身上学到了不少东西,也希望读者多花点时间读读本书,一定会同样有所收益。
——MarkCallaghan,Facebook软件工程师