日期:2016-08-25 阅读:1290
dmandwp系统 - wordpress系统和DM系统区块建站>>
推荐序
前言
第1章MySQL架构与历史1
1.1MySQL逻辑架构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.4MySQL中的事务10
1.4多版本并发控制12
1.5MySQL的存储引擎13
1.5.1InnoDB存储引擎16
1.5.2MyISAM存储引擎17
1.5.3MySQL内建的其他存储引擎19
1.5.4第三方存储引擎22
1.5.5选择合适的引擎24
1.5.6转换表的引擎27
1.6MySQL时间线(Timeline)29
1.7MySQL的开发模式32
1.8总结33
第2章MySQL基准测试35
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.1http_load53
2.5.2MySQL基准测试套件54
2.5.3sysbench55
2.5.4数据库测试套件中的dbt2TPC—C测试60
2.5.5Percona的TPCC—MySQL测试工具63
2.6总结65
第3章服务器性能剖析67
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与数据类型优化111
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.2MySQLschema设计中的陷阱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章创建高性能的索引141
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章查询性能优化195
6.1为什么查询速度会慢195
6.2慢查询基础:优化数据访问196
6.2.1是否向服务器请求了不需要的数据196
6.2.2MySQL是否在扫描额外的记录198
6.3重构查询的方式201
6.3.1一个复杂查询还是多个简单查询201
6.3.2切分查询202
6.3.3分解关联查询203
6.4查询执行的基础204
6.4.1MySQL客户端/服务器通信协议205
6.4.2查询缓存208
6.4.3查询优化处理208
6.4.4查询执行引擎222
6.4.5返回结果给客户端223
6.5MySQL查询优化器的局限性223
6.5.1关联子查询223
6.5.2UNION的限制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高级特性259
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.2SQL接口的绑定变量286
7.6.3绑定变量的限制288
7.7用户自定义函数289
7.8插件290
7.9字符集和校对291
7.9.1MySQL如何使用字符集292
7.9.2选择字符集和校对规则295
7.9.3字符集和校对规则如何影响查询296
7.10全文索引299
7.10.1自然语言的全文索引300
7.10.2布尔全文索引302
7.10.3MySQL5.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.1MySQL如何判断缓存命中309
7.12.2查询缓存如何使用内存311
7.12.3什么情况下查询缓存能发挥作用313
7.12.4如何配置和维护查询缓存316
7.12.5InnoDB和查询缓存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
我们写这本书不仅仅是为了满足MySQL 应用开发者的需求,也是为了满足MySQL 数据库管理员的需要。我们假定读者已经有了一定的MySQL 基础。我们还假定读者对于系统管理、网络和类Unix 的操作系统都有一些了解。
本书的第二版为读者提供了大量的信息,但没有一本书是可以涵盖一个主题的所有方面的。在第二版和第三版之间的这段时间里,我们记录了数以千计有趣的问题,其中有些是我们解决的,也有一些是我们观察到其他人解决的。当我们在规划第三版的时候发现,如果要把这些主题完全覆盖,可能三千页到五千页的篇幅都还不够,这样本书的完成就遥遥无期了。在反思这个问题后,我们意识到第二版强调的广泛的覆盖度事实上有其自身的限制,从某种意义上来说也没有引导读者如何按照MySQL 的方式来思考问题。
所以第三版和第二版的关注点有很大的不同。我们虽然还是会包含很多的信息,并且会强调同样的诸如可靠性和正确性的目标,但我们也会在本书中尝试更深入的讨论:我们会指出MySQL 为什么会这样做,而不是MySQL 做了什么。我们会使用更多的演示和案例学习来将上述原则落地。通过这样的方式,我们希望能够尝试回到下面这样的问题:“给出MySQL 的内部结构和操作,对于实际应用能带来什么帮助?为什么能有这样的帮助?如何让MySQL 适合(或者不适合)特定的需求?”
最后,我们希望关于MySQL 内部原理的知识能够帮助大家解决本书没有覆盖到的一些情况。我们更希望读者能培养发现新问题的洞察力,能学习和实践合理的方式来设计、维护和诊断基于MySQL 的系统。
本书是如何组织的
本书涵盖了许多复杂的主题。在这里,我们将解释一下是如何将这些主题有序地组织在一起的,以便于阅读和学习。
概述
第1 章是非常基础的一章,在更深入地学习之前建议先熟悉一下这部分内容。在有效地使用MySQL 之前应当理解它是如何组织的。本章解释了MySQL 的架构及其存储引擎的关键设计。如果读者还不太熟悉关系数据库和事务的基础知识,本章也可以带来一点帮助。如果之前已经对其他关系数据库如Oracle 比较熟悉,本章也可以帮助读者了解MySQL 的入门知识。本章还包括了一点MySQL 的历史背景:MySQL 随着时间的演进、最近的公司所有权更替,以及我们认为比较重要的内容。
打造坚实的基础
本书前几章的内容在今后使用MySQL 的过程中可能会被不断地引用到,它们是非常基础的内容。
第2章讨论了基准测试的基础,例如服务器可以处理的工作负载的类型、处理特定任务的速度等。基准测试是一项至关重要的技能,可用于评估服务器在不同负载下的表现,但也要明白在什么情况下基准测试不能发挥作用。
第3章介绍了我们常用于故障诊断和服务器性能问题分析的一种面向响应时间的方法。该方法已经被证明可以解决我们曾碰到过的一些极为棘手的问题。当然也可以选择修改我们所使用的方法(实际上我们的方法也是从Cary Millsap 的方法修改而来的),但无论如何,至少不能没有方法胡乱猜测。
从第4章到第6 章,连续介绍了三个关于良好的数据库逻辑设计和物理设计基础的话题。第4 章涵盖了不同数据类型的细节差别以及表设计的原则。第5 章则展开讨论了索引,这是数据库的物理设计。对于索引的深入理解和利用是高效使用MySQL 的基础,相信这一章会经常需要回头翻看。而第6 章则包含了分析MySQL 的查询是如何执行的,以及如何利用查询优化器的话题。该章也包含了大量常见类型查询的例子,演示了MySQL 是如何做好工作的,以及如何改写查询以利用MySQL 的特性。
到此为止,已经覆盖了关于数据库的基础内容:表、索引、数据和查询。第7 章则在MySQL 基础知识之外介绍了MySQL 的高级特性是如何工作的。这章的内容包括分区、存储引擎、触发器,以及字符集。MySQL 中这些特性的实现可能不同于其他数据库,可能之前读者并不清楚这些不同,因此理解它们对于性能可能会带来新的收益。
配置应用程序
接下来的两章讲述的是如何让MySQL、应用程序及硬件一起很好地工作。第8 章介绍了如何配置MySQL,以便更好地利用硬件,达到更好的可靠性和鲁棒性。第9 章解释了如何让操作系统和硬件工作得更好。另外也深入讨论了固态硬盘,为高可扩展性应用发挥更好的性能提供了硬件配置的建议。
上面两章都一定程度地涉及了MySQL 的内部知识。这将会是一个反复出现的主题,附录中也会有相关内容可以学习到MySQL 的内部是如何实现的,理解了这些知识将帮助读者更好地理解某些现象背后的原理。
作为基础设施组件的MySQL
MySQL 不是存在于真空中的,而是应用整体的一个环节,因此需要考虑整个应用架构的鲁棒性。下面的章节将告诉我们该如何做到这一点。
第10 章讨论了MySQL 的杀手级特性:能够设置多个服务器从一台主服务器同步数据。不幸的是,复制可能也是MySQL 给很多用户带来困扰的一个特性。但实际上不应该发生这样的情况,本章将告诉你如何让复制运行得更好。
第11章讨论了什么是可扩展性(这和性能不是一回事),应用和系统为什么会无法扩展,该怎么改善扩展性。如果能够正确地处理,MySQL 的可扩展性是足以应付任何需求的。
第12章讲述的是和可扩展性相关但又完全不同的主题:如何保障MySQL 稳定而正确地持续运行。第13 章将告诉你当MySQL 在云计算环境中运行时会有什么不同的事情发生。
第14章解释了什么是全方位的优化(full-stack optimization),就是从前端到后端的整体优化,从用户体验开始直到数据库。
即使是世界上设计最好、最具可扩展性的架构,如果停电会导致彻底崩溃,无法抵御恶意攻击,解决不了应用的bug 和程序员的错误,以及其他一些灾难场景,那就不是什么好的架构。第15 章讨论了MySQL 数据库各种备份与恢复的场景。这些策略可以帮助读者减少在各种不可抗的硬件失效时的宕机时间,保证在各种灾难下的数据最终可恢复。
其他有用的主题
在本书的最后一章以及附录中,我们探讨了一些无法明确地放到前面章节的内容,以及一些被前面多个章节引用而需要特别注意的主题。
第16章探索了一些可以帮助用户更有效地管理和监控MySQL 服务器的工具,有些是开源的,也有些是商业的。
附录A 介绍了近年来成长迅速的三个主要的非MySQL 官方版本,其中一个是我们公司在维护的产品。知道还有其他什么是可用的选择是有价值的;很多MySQL 难以解决的棘手问题在其他的变种版本中说不定就不是问题了。这三个版本中的两个(Percona Server 和MariaDB)是MySQL 的完全可替换版本,所以尝试使用的成本相对来说是很低的。当然,在这里我们也需要补充一点,Oracle 提供的MySQL 官方版本对于大多数用户来说都能服务得很好。
附录B 演示了如何检查MySQL 服务器。知道如何从服务器获取状态信息是非常重要的;而了解这些状态代表的意义则更加重要。这里将覆盖SHOW INNODB STATUS 的输出结果,因此这里包含了InnoDB 事务存储引擎的深入信息。在这个附录中讨论了很多InnoDB的内部信息。
附录C 演示了如何高效地将大文件从一个地方复制到另外一个地方。如果要管理大量的数据,这种操作是经常都会碰到的。附录D 演示了如何真正地使用并理解EXPLAIN 命令。附录E 演示了如何破除不同查询所请求的锁互相干扰的问题。最后,附录F 介绍了Sphinx,一个基于MySQL 的高性能的全文索引系统。
软件版本与可用性
MySQL 是一个移动靶。从Jeremy 写作本书第一版到现在,MySQL 已经发布了好几个版本。当本书第一版的初稿交给出版社的时候,MySQL 4.1 和5.0 还只是alpha 版本,而如今MySQL 5.1 和5.5 已经是很多在线应用的主力版本。在我们写完这第三版的时候,MySQL 5.6 也即将发布。
本书的内容并不依赖某一个具体的版本。相反,我们会利用自己在实际环境中获得的更广泛的知识。本书的核心内容主要关注MySQL 5.1 和5.5 版本,因为我们认为这是“当前”的版本。本书的大多数例子都假设运行在MySQL 5.1 的某个成熟版本上,比如MySQL 5.1.50 或者更高的版本。对于在旧版本中可能不存在,或者只在即将到来的5.6 版本中出现的特性或者功能,我们也会特别标注出来。然而,关于某个MySQL 版本的特性的权威指南还是要看官方文档。在阅读本书时,建议随时访问在线官方文档的相关内容
(http://dev.mysql.com/doc/)。
MySQL 的另外一个伟大特点是能够运行在现今流行的所有平台:Mac OS X,Windows,GNU/Linux, Solaris, FreeBSD,以及只要你能举出名字的其他平台。然而,本书主要基于GNU/Linux和其他类Unix 系统。Windows 的用户可能会碰到一些困难。比如说文件路径就和Windows 完全不一样。我们也会引用一些Unix 的命令行工具,我们假设读者能够知道Windows 上对应的工具是什么。
在Windows 上搞MySQL 的另外一个难点是Perl。MySQL 中有很多有用的工具是用Perl 写的。在本书的一些章节中,也有一些Perl 脚本,在此基础上可以构建更加复杂的工具。Percona Toolkit 是不可多得的MySQL 管理工具,也是用Perl 写的。然而,Windows 平台默认是没有Perl 环境的。为了使用这些工具,需要从ActiveState 下载Perl的Windows 版本,以及访问MySQL 所需要的一些额外的模块(DBI 和DBD::MySQL)。
本书使
译者序
在互联网行业,MySQL 数据库毫无疑问已经是最常用的数据库。LAMP(Linux +Apache + MySQL + PHP)甚至已经成为专有名词,也是很多中小网站建站的首选技术架构。我所在的公司淘宝网,在2003 年非典肆虐期间创立时,选择的就是LAMP 架构,当时MySQL 的版本还是4.0。但是到了2003 年底,由于业务超预期的增长,MySQL 4.0(当时用的还是MyISAM 引擎)的很多缺点在高并发大压力下暴露了出来,于是技术上开始改用商业的Oracle 数据库。随后几年Oracle 加小型机和高端存储的数据库架构支撑了淘宝网业务的爆炸式增长,数据库也从最初的两三个库增长到十几个库,并且每个库的硬件已经逐步升级到顶配,“天花板”很明显地摆在了眼前。于是在2008 年,基于PC 服务器的MySQL 数据库再次成为DBA 团队的选择,这时候MySQL 的稳定版本已经升级到5.0,并且5.1 也已经在开发中,性能和特性相对于2003 年的时候已经有了非常大的提升。淘宝网的数据库架构也逐渐从垂直拆分走向水平拆分,在大规模水平集群的架构设计中,开源的MySQL 受到的关注度越来越高,并且一年多来的实践也证明了MySQL(存储引擎主要使用的是InnoDB)在高压力下的可用性。于是从2009 年开始,后来颇受外界关注的所谓“去IOE”开始实施,经过三年多的架构改造,到2012年整个淘宝网的核心交易系统已经全部运行在基于PC 服务器的MySQL 数据库集群中,全部实例数超过2000 个。今年的“双11”大促中,MySQL 单库经受了最高达6.5 万的QPS,某个拥有32 个节点的核心集群的总QPS 则稳定在86 万以上,并且在整个大促(包括之前三年的“双11”大促)期间,数据库未发生过任何影响大促的重大故障。当然,这个结果,也得益于淘宝网整个应用架构的设计,以及这几年来革命性的闪存设备的迅猛发展。
2008 年,淘宝DBA 团队准备从Oracle 转向MySQL 的时候,团队中的大多数人对MySQL 的了解都非常之少。当时国内技术圈对MySQL 的讨论也不多见,网上能找到的大多数中文资料基本上关注的还是如何安装,如何配置主备复制等。而MySQL 中文类的书籍,大部分还是和PHP 放在一起,作为PHP 开发中的一环来讲述的。所以当我们发现mysqlperformanceblog.com(现在改名为https://www.percona.com/blog/) 这个相当专业的国外博客的时候,无不欣喜莫名。同时也知道了博客的作者们2008 年出版的High Performance MySQL 第二版(中文版于2010 年1 月出版),这本书被很多MySQL DBA 们奉为圭皋,书的三位主要作者Baron Schwartz、Peter Zaitsev 和Vadim Tkachenko 也在MySQL DBA 圈中耳熟能详,他们组建的Percona 公司和Percona Server 分支版本以及XtraDB 存储引擎也逐渐为国内DBA所熟知。2011 年12 月,淘宝网和O'Reilly 在北京联合举办的Velocity China 2011 技术大会上,我们有幸邀请到Percona 公司的华人专家季海东(目前已离职)来介绍MySQL 5.5 InnoDB/XtraDB 的性能优化和诊断方法。在季海东先生的引荐下,我们也和Peter 通过Skype 电话会议有过沟通,介绍了MySQL 在淘宝的应用情况,我们对MySQL 一些特性的需求,以及对MySQL 做的一些patch,并随后保持了密切的邮件联系。有了这些铺垫,我们对于在生产系统中采用Percona Server 5.5 也有了更大的信心,如今已有超过1000个Percona Server 5.5 的实例在线上运行。所以今年上半年电子工业出版社的张春雨(侠少)编辑找到我来翻译本书的第三版的时候,很是激动,一口应承。
考虑到这么经典的书应该尽快地和读者见面,故此我邀请了团队中的MySQL 专家周振兴(花名:苏普)、彭立勋、翟卫祥(花名:印风)、刘辉(花名:希羽)一起来翻译。其中,我负责前、推荐序和第1、2、3 章,周振兴负责第5、6、7 章,彭立勋负责第4、8、9、14 章,翟卫祥负责第10、11、12、13 章,刘辉负责第15、16 章和附录部分,最后由我负责统稿。所以毫无疑问,这本书是团队合作的结晶。虽然我们满怀激情,但由于都是第一次参与翻译技术书籍,确实对困难有些预估不足,加上下半年为了准备“双11”等各种大促,需要在DBA 团队满负荷的工作间隙挤出个人时间,初稿出来后,由于每个人翻译风格不太一致,几次审稿修订,也让本书的编辑李云静和白涛吃了不少苦头,在此对大家表示深深的感谢,是大家不懈的努力,才使得本书能够顺利地和读者见面。但书中肯定还存在不少问题,也恳请读者不吝指出,欢迎大家和我的新浪微博http://weibo.com/NinGoo 进行互动。