InnoDB是MySQL数据库中最常用、最核心和最重要的存储引擎之一,它是为处理海量数据时仍能获得最佳性能而设计的。它的CPU效率可能是任何其他基于磁盘的关系数据库引擎所不能匹敌的。
MySQL与其他数据库的一个显著不同在于它特有的插件式存储引擎架构。InnoDB作为MySQL的首选存储引擎已经被Facebook、Yahoo等很多大公司所采用并工作在其核心数据库应用中,已经被证明是一种高性能、高并发性和高可用性的存储引擎。几乎所有涉及大数据量的MySQL数据库应用架构都会采用,也必须采用InnoDB存储引擎。因此,掌握InnoDB存储引擎就等于掌握了MySQL数据库的核心。无论是DBA,还是一般的应用开发人员,要设计和管理高性能、高可用的数据库系统,都需要理解和掌握数据库的体系结构和内部实现。对于所有MySQL用户而言,如果要真正用好MySQL,要让它最佳地工作,就必须先彻底地掌握InnoDB。
本书从源代码的角度,对InnoDB的实现原理和工作机制进行了全面而深入的探讨,深度、广度和实践性完美结合,相信能给广大MySQL一用户带来帮助。
本书是国内目前唯一的一本关于InnoDB的著作,由资深MySQL专家亲自执笔,中外数据库专家联袂推荐,权威性毋庸置疑。
内容深入,从源代码的角度深度解析了InnoDB的体系结构、实现原理、工作机制,并给出了大量最佳实践,能帮助你系统而深入地掌握InnoDB,更重要的是,它能为你设计和管理高性能、高可用的数据库系统提供绝佳的指导。注重实战,全书辅有大量的案例,可操作性极强。全书首先全景式地介绍了MySQL独有的插件式存储引擎,分析了MySQL的各种存储引擎的优势和应用环境;接着以InnoDB的内部实现为切入点,逐一详细讲解了InnoDB存储引擎内部的各个功能模块,包括InnoDB存储引擎的体系结构、内存中的数据结构、基于InnoDB存储引擎的表和页的物理存储、索引与算法、文件、锁、事务、备份,以及InnoDB的性能调优等重要的知识;最后深入解析了InnoDB存储引擎的源代码结构,对大家阅读和理解InnoDB的源代码有重要的指导意义。
本书适合所有希望构建和管理高性能、高可用性的MySQL数据库系统的开发者和DBA阅读。
推荐序
前言
致谢
第1章 MySQL体系结构和存储引擎/1
1.1 定义数据库和实例/1
1.2 MySQL体系结构/3
1.3 MySQL表存储引擎/5
1.3.1 InnoDB存储引擎/6
1.3.2 MyISAM存储引擎/7
1.3.3 NDB存储引擎/7
1.3.4 Memory存储引擎/8
1.3.5 Archive存储引擎/9
1.3.6 Federated存储引擎/9
1.3.7 Maria存储引擎/9
1.3.8 其他存储引擎/9
1.4 各种存储引擎之间的比较/10
1.5 连接MySQL/13
1.5.1 TCP/IP/13
1.5.2 命名管道和共享内存/14
1.5.3 Unix域套接字/15
1.6 小结/15
第2章 InnoDB存储引擎/17
2.1 InnoDB存储引擎概述/17
2.2 InnoDB体系架构/18
2.2.1 后台线程/19
2.2.2 内存/22
2.3 master thread/24
2.3.1 master thread源码分析/25
2.3.2 master thread的潜在问题/30
2.4 关键特性/33
2.4.1 插入缓冲/33
2.4.2 两次写/36
2.4.3 自适应哈希索引/38
2.5 启动、关闭与恢复/39
2.6 InnoDB Plugin = 新版本的InnoDB存储引擎/42
2.7 小结/44
第3章 文件/45
3.1 参数文件/45
3.1.1 什么是参数/46
3.1.2 参数类型/47
3.2 日志文件/48
3.2.1 错误日志/48
3.2.2 慢查询日志/50
3.2.3 查询日志/54
3.2.4 二进制日志/55
3.3 套接字文件/64
3.4 pid文件/64
3.5 表结构定义文件/65
3.6 InnoDB存储引擎文件/65
3.6.1 表空间文件/66
3.6.2 重做日志文件/67
3.7 小结/70
第4章 表/72
4.1 InnoDB存储引擎表类型/72
4.2 InnoDB逻辑存储结构/72
4.2.1 表空间/72
4.2.2 段/75
4.2.3 区/75
4.2.4 页/82
4.2.5 行/83
4.3 InnoDB物理存储结构/83
4.4 InnoDB行记录格式/83
4.4.1 Compact 行记录格式/85
4.4.2 Redundant 行记录格式/88
4.4.3 行溢出数据/91
4.4.4 Compressed与Dynamic行记录格式/98
4.4.5 Char的行结构存储/99
4.5 InnoDB数据页结构/101
4.5.1 File Header/103
4.5.2 Page Header/104
4.5.3 Infimum和Supremum记录/105
4.5.4 User Records与FreeSpace/106
4.5.5 Page Directory/106
4.5.6 File Trailer/107
4.5.7 InnoDB数据页结构示例分析/107
4.6 Named File Formats/114
4.7 约束/116
4.7.1 数据完整性/116
4.7.2 约束的创建和查找/117
4.7.3 约束和索引的区别/119
4.7.4 对于错误数据的约束/119
4.7.5 ENUM和SET约束/120
4.7.6 触发器与约束/121
4.7.7 外键/123
4.8 视图/125
4.8.1 视图的作用/125
4.8.2 物化视图/128
4.9 分区表/132
4.9.1 分区概述/132
4.9.2 RANGE分区/134
4.9.3 LIST分区/141
4.9.4 HASH分区/143
4.9.5 KEY分区/146
4.9.6 COLUMNS分区/146
4.9.7 子分区/148
4.9.8 分区中的NULL值/152
4.9.9 分区和性能/155
4.10 小结/159
第5章 索引与算法/160
5.1 InnoDB存储引擎索引概述/160
5.2 二分查找法/161
5.3 平衡二叉树/162
5.4 B+树/164
5.4.1 B+树的插入操作/165
5.4.2 B+树的删除操作/167
5.5 B+树索引/169
5.5.1 聚集索引/170
5.5.2 辅助索引/174
5.5.3 B+树索引的管理/178
5.6 B+树索引的使用/183
5.6.1 什么时候使用B+树索引/183
5.6.2 顺序读、随机读与预读取/188
5.6.3 辅助索引的优化使用/191
5.6.4 联合索引/194
5.7 哈希算法/198
5.7.1 哈希表/199
5.7.2 InnoDB存储引擎中的哈希算法/201
5.7.3 自适应哈希索引/201
5.8 小结/203
第6章 锁/204
6.1 什么是锁/204
6.2 InnoDB存储引擎中的锁/205
6.2.1 锁的类型/205
6.2.2 一致性的非锁定读操作/211
6.2.3 SELECT...OR UPDATE & SELECT...LOCK IN SHARE MODE/214
6.2.4 自增长和锁/215
6.2.5 外键和锁/217
6.3 锁的算法/218
6.4 锁问题/220
6.4.1 丢失更新/221
6.4.2 脏读/222
6.4.3 不可重复读/223
6.5 阻塞/224
6.6 死锁/227
6.7 锁升级/229
6.8 小结/229
第7章 事务/230
7.1 事务概述/230
7.2 事务的实现/231
7.2.1 redo/231
7.2.2 undo/233
7.3 事务控制语句/236
7.4 隐式提交的SQL语句/241
7.5 对于事务操作的统计/243
7.6 事务的隔离级别/244
7.7 分布式事务/248
7.8 不好的事务习惯/253
7.8.1 在循环中提交/253
7.8.2 使用自动提交/255
7.8.3 使用自动回滚/256
7.9 小结/258
第8章 备份与恢复/260
8.1 备份与恢复概述/260
8.2 冷备/262
8.3 逻辑备份/263
8.3.1 mysqldump/263
8.3.2 SELECT...INTO OUTFILE/270
8.3.3 逻辑备份的恢复/272
8.3.4 LOAD DATA INFILE/273
8.3.5 mysqlimport/278
8.4 二进制日志备份与恢复/280
8.5 热备/281
8.5.1 ibbackup/281
8.5.2 XtraBackup/282
8.5.3 XtraBackup实现增量备份/284
8.6 快照备份/286
8.7 复制/291
8.7.1 复制的工作原理/291
8.7.2 快照+复制的备份架构/295
8.8 小结/297
第9章 性能调优/298
9.1 选择合适的CPU/298
9.2 内存的重要性/299
9.3 硬盘对数据库性能的影响/302
9.3.1 传统机械硬盘/302
9.3.2 固态硬盘/302
9.4 合理地设置RAID/304
9.4.1 RAID类型/304
9.4.2 RAID Write Back功能/306
9.4.3 RAID配置工具/308
9.5 操作系统的选择也很重要/311
9.6 不同的文件系统对数据库性能的影响/312
9.7 选择合适的基准测试工具/313
9.7.1 sysbench/313
9.7.2 mysql-tpcc/320
9.8 小结/324
第10章 InnoDB存储引擎源代码的编译和调试/325
10.1 获取InnoDB存储引擎源代码/325
10.2 InnoDB源代码结构/329
10.3 编译和调试InnoDB源代码/330
10.3.1 Windows下的调试/330
10.3.2 Linux下的调试/333
10.4 小结/338
附录A Secondary Buffer Pool For InnoDB/339
附录B Master Thread源代码/342
附录C Doublewrite源代码/353
附录D 哈希算法和哈希表源代码/361