第一部分 MySQL开发入门
第1章 MySQL与开源运动 2
1.1 什么是开源软件 2
1.1.1 为什么要使用开源软件 4
1.1.2 开源软件是否对商业软件构成真正的威胁 7
1.1.3 法律问题与《GNU宣言》 8
1.1.4 将开源进行到底 10
1.2 用MySQL进行开发 11
1.2.1 为什么修改MySQL 13
1.2.2 MySQL里哪些可以修改,有什么限制 14
1.2.3 MySQL的许可证问题 15
1.2.4 到底能否修改MySQL 16
1.2.5 修改MySQL的指导原则 17
1.3 实际的例子:TiVo 18
1.4 小结 19
第2章 数据库系统剖析 20
2.1 数据库系统的体系结构 20
2.2 数据库系统的类型 20
2.2.1 面向对象数据库系统 20
2.2.2 对象关系数据库系统 21
2.2.3 关系数据库系统 23
2.3 关系数据库系统的体系结构 24
2.3.1 客户端应用程序 25
2.3.2 查询接口 26
2.3.3 查询处理 27
2.3.4 查询优化器 29
2.3.5 查询的内部表示 31
2.3.6 查询的执行 32
2.3.7 文件访问 33
2.3.8 查询结果 35
2.3.9 关系数据库的体系结构小结 35
2.4 MySQL数据库系统 35
2.4.1 MySQL系统体系结构 36
2.4.2 SQL接口 37
2.4.3 解析器 38
2.4.4 查询优化器 39
2.4.5 查询的执行 40
2.4.6 查询缓存 40
2.4.7 缓存和缓冲区 42
2.4.8 通过插件式存储引擎访问文件 43
2.5 小结 50
第3章 MySQL源代码 51
3.1 预备知识 51
3.1.1 了解许可证 51
3.1.2 获得MySQL源代码 52
3.2 MySQL源代码 56
3.2.1 预备知识 57
3.2.2 main()函数 59
3.2.3 处理连接和创建线程 62
3.2.4 解析查询 69
3.2.5 优化查询的准备工作 75
3.2.6 优化查询 78
3.2.7 执行查询 80
3.2.8 辅助库 82
3.2.9 重要的类和结构 83
3.3 编程指导 88
3.3.1 总体指导 89
3.3.2 文档 89
3.3.3 函数和参数 91
3.3.4 命名约定 92
3.3.5 分隔与缩进 92
3.3.6 文档工具 93
3.3.7 保持工作记录的习惯 95
3.3.8 追踪变化 95
3.4 第一次构建系统 97
3.5 小结 100
第4章 测试驱动的MySQL开发 101
4.1 背景知识 101
4.1.1 为什么要测试 101
4.1.2 基准测试 103
4.1.3 性能分析 105
4.1.4 软件测试简介 107
4.1.5 功能测试与缺陷测试 107
4.2 MySQL测试 111
4.2.1 MySQL Test Suite 111
4.2.2 MySQL基准测试 119
4.2.3 MySQL性能分析 124
4.3 小结 126
第二部分 扩展MySQL
第5章 调试 128
5.1 调试介绍 128
5.2 调试技术 129
5.2.1 基本过程 129
5.2.2 内嵌调试语句 131
5.2.3 出错处理器 134
5.2.4 外部调试器 135
5.3 调试MySQL 142
5.3.1 内嵌调试语句 143
5.3.2 出错处理器 148
5.3.3 在Linux环境里调试MySQL 148
5.3.4 在Windows环境里调试MySQL 157
5.4 小结 161
第6章 嵌入式MySQL 162
6.1 构建嵌入式应用 162
6.1.1 什么是嵌入式系统 162
6.1.2 嵌入式系统的种类 163
6.1.3 嵌入式数据库系统 163
6.2 嵌入MySQL 164
6.2.1 嵌入MySQL的方法 165
6.2.2 资源要求 167
6.2.3 安全问题 167
6.2.4 嵌入MySQL的优点 167
6.2.5 嵌入MySQL的局限性 168
6.3 MySQL C API 168
6.3.1 预备知识 168
6.3.2 最常用的函数 169
6.3.3 创建嵌入式服务器 170
6.3.4 对服务器进行初始化 171
6.3.5 设置选项 172
6.3.6 连接到服务器 172
6.3.7 运行查询命令 173
6.3.8 检索查询结果 174
6.3.9 清理 175
6.3.10 与服务器断开连接并关闭服务器 175
6.3.11 汇总 175
6.3.12 出错处理 177
6.4 构建嵌入式MySQL应用程序 177
6.4.1 编译libmysqld库 177
6.4.2 调试问题如何解决 178
6.4.3 数据问题如何解决 180
6.4.4 创建基本的嵌入式服务器 180
6.4.5 出错处理问题如何解决 189
6.4.6 嵌入式服务器应用程序 189
6.5 小结 214
第7章 创建自己的存储引擎 215
7.1 MySQL插件式存储引擎概述 215
7.1.1 基本过程 217
7.1.2 需要用到的源文件 218
7.1.3 其他辅助资源 218
7.1.4 handlerton类 218
7.1.5 handler类 221
7.1.6 对MySQL存储引擎的简要分析 225
7.2 Spartan存储引擎 226
7.2.1 底层I/O类 227
7.2.2 预备知识 250
7.2.3 阶段1:生成引擎存根 251
7.2.4 阶段2:处理表 262
7.2.5 阶段3:数据的读/写 269
7.2.6 阶段4:数据的更新和删除 273
7.2.7 阶段5:数据的索引 280
7.2.8 阶段6:添加事务支持 299
7.3 小结 303
第8章 为MySQL添加函数和命令 305
8.1 添加用户定义函数 305
8.1.1 CREATE FUNCTION命令的语法 305
8.1.2 DROP FUNCTION命令的语法 306
8.1.3 创建用户定义库 306
8.1.4 添加新的用户定义函数 311
8.2 添加本机函数 315
8.2.1 在Windows平台上生成词法散列表 318
8.2.2 在Linux平台上生成词法散列表 318
8.2.3 编译和测试新的本机函数 318
8.3 添加SQL命令 319
8.4 添加到信息模式 327
8.5 小结 333
第三部分 高级数据库的内部组成
第9章 数据库系统的内部组成 336
9.1 查询执行 336
9.1.1 重温MySQL查询执行 336
9.1.2 什么是已编译查询 337
9.2 深入MySQL的内部 337
9.2.1 开始用MySQL做实验 338
9.2.2 注意事项 340
9.3 数据库系统内部组成实验 340
9.3.1 为什么叫实验 341
9.3.2 实验项目概述 341
9.3.3 实验项目的组成部分 342
9.3.4 在Linux平台上进行实验 343
9.3.5 在Windows平台上进行实验 343
9.4 小结 343
第10章 内部查询表示 344
10.1 查询树 344
10.1.1 查询转换 346
10.1.2 DBXP查询树 347
10.2 在MySQL里实现DBXP查询树 348
10.2.1 被添加和修改的文件 349
10.2.2 创建测试 349
10.2.3 为SELECT DBXP命令生成存根 350
10.2.4 添加查询树类 357
10.2.5 显示查询树的细节 366
10.3 小结 373
第11章 查询优化 374
11.1 查询优化器的类型 374
11.1.1 基于开销的优化器 375
11.1.2 启发式优化器 377
11.1.3 语义优化器 377
11.1.4 参数优化器 378
11.2 再次讨论启发式优化 378
11.3 DBXP查询优化器 379
11.3.1 测试设计 379
11.3.2 为SELECT DBXP命令生成存根 380
11.3.3 重要的MySQL结构和类 382
11.3.4 DBXP辅助类 385
11.3.5 修改现有代码 386
11.3.6 启发式优化器的细节 390
11.3.7 代码的编译和测试 413
11.4 小结 417
第12章 查询执行 418
12.1 回顾查询执行 418
12.1.1 投影 418
12.1.2 限制 419
12.1.3 联结 419
12.2 DBXP查询执行 429
12.2.1 测试的设计 430
12.2.2 更新SELECT DBXP命令 431
12.2.3 DBXP算法 433
12.2.4 代码的编译和测试 454
12.3 小结 457
附录 459