电子书 编程

从零开始用 Go 构建数据库(第 2 版)(英文版电子书)

¥1.90 已售 0
✓ 自动发货 ✓ 永久有效 ✓ 售后保障

资源介绍

在数据库技术日益复杂的当下,许多开发者对数据库的理解停留在 “调用工具” 层面,却难以深入其核心原理。而《从零开始用 Go 构建数据库(第 2 版)》正是一本打破这种 “黑箱认知” 的实践指南 —— 它以 “边做边学” 为核心,通过仅 3000 行 Go 语言代码,带领读者从底层数据结构出发,逐步构建出支持 B + 树索引、持久化键值存储、事务与 SQL 查询的完整数据库,让复杂的数据库原理变得可触摸、可实现。 全书结构清晰,按 “基础原理 — 核心组件 — 高级功能” 的逻辑层层递进,共 14 章,每一步都围绕 “增量编码” 展开,确保读者能跟随代码演进理解数据库的构建过程。开篇的 “引言” 章节明确了全书核心目标:掌握数据库的四大核心原理 —— 原子性与持久性、基于 B 树的键值存储、键值之上的关系型结构、事务并发控制,并用 “代码行数里程碑” 让读者清晰看到每一步的成果,例如 366 行实现 B + 树数据结构、601 行完成追加式键值存储、2795 行实现类 SQL 查询语言,这种量化的进度感大幅降低了学习门槛。 前 6 章聚焦数据库的底层基石。第 1 章从 “文件到数据库” 的痛点切入,对比普通文件存储(如 JSON)与数据库的差异 —— 前者在崩溃时易出现数据丢失或半写状态,而数据库通过fsync系统调用、原子重命名、追加式日志等技术解决原子性与持久性问题,并给出了 Go 语言实现的文件安全读写示例。第 2 章深入索引数据结构,分析哈希表(仅支持点查询)、有序数组(更新成本高)的局限性,重点讲解 B + 树和 LSM 树为何成为磁盘存储的优选:B + 树通过多叉结构减少磁盘 IO 次数,LSM 树则通过 “合并” 策略降低写放大,两者的对比为后续实现奠定理论基础。 第 3-6 章是 B + 树与键值存储的核心实现阶段。第 3 章解析 B + 树的平衡特性与崩溃恢复机制,提出 “写时复制(Copy-on-Write)” 策略 —— 更新时复制节点而非直接修改,既保留旧版本数据以实现快照隔离,又简化崩溃恢复;同时对比 “双写缓冲” 方案,帮助读者理解不同持久化策略的 trade-off。第 4-5 章则手把手教读者实现 B + 树的节点设计、插入与删除逻辑,包括节点分裂与合并的具体代码,还通过 “哨兵值” 等技巧处理边界案例(如空树查询)。第 6 章将 B + 树落地到磁盘,设计 “元数据页 + 数据页” 的文件布局,通过两阶段更新(先写新节点、再更新根指针)确保原子性,并引入mmap技术实现文件与内存的高效映射,完成 “可持久化键值存储” 的核心功能。 第 7-10 章聚焦键值存储的优化与关系型结构的构建。第 7 章解决 “空间复用” 问题 —— 此前的追加式存储会导致磁盘空间不断增长,通过 “空闲列表(Free List)” 管理已删除页面,设计基于磁盘的链表结构,实现页面的回收与复用,使键值存储具备生产级实用性。第 8-10 章则从 “键值” 迈向 “关系型”:第 8 章将表的行与列编码为键值对,以主键作为键、其他列作为值,二级索引则设计为 “索引列 + 主键” 的键值结构,例如表t1的索引idx1(v1)对应键为v1+主键、值为空,通过这种映射实现多维度查询;第 9 章实现范围查询,核心是 B + 树迭代器与 “保序编码”—— 将整数、字符串等类型编码为可按字节比较的格式(如整数通过大端序 + 符号位翻转保证排序正确,字符串通过转义分隔符避免歧义);第 10 章完善二级索引,解决索引与主数据的同步更新问题,并指出 “多键更新的原子性” 需依赖后续事务功能。 第 11-14 章实现数据库的高级功能。第 11 章引入事务,基于写时复制机制实现 “Begin-Commit-Abort” 接口 —— 事务开始时保存当前元数据快照,提交时通过两阶段更新写入磁盘,失败时回滚到快照状态,同时解决二级索引更新的原子性问题。第 12 章聚焦并发控制,对比读写锁(RWLock)、读复制更新(RCU)、乐观并发控制(OCC)等方案,最终选择 OCC:事务读取时记录依赖范围,提交前检查与其他已提交事务的冲突,冲突则 abort,这种方案在读多写少场景下性能更优,还通过 “版本号” 管理空闲列表,避免复用仍被旧事务引用的页面。 第 13-14 章完成 “类 SQL 查询语言” 的实现,这是关系型数据库的 “门面”。第 13 章讲解递归下降解析器的构建,将 SQL 语句(如SELECT a, b FROM t1 INDEX BY x > 1 FILTER y < 5)拆解为抽象语法树(AST),通过 “优先级递归” 处理运算符 precedence(如*高于+、AND高于OR),代码仅依赖递归逻辑,无需复杂的语法分析工具。第 14 章实现表达式求值与结果迭代,将 AST 转化为可执行逻辑,例如SELECT a + b会解析为 “读取列 a 与 b、执行加法运算” 的节点,并通过迭代器模式处理大数据集(避免内存溢出),最终完成 “解析 — 求值 — 返回结果” 的完整链路。 全书的核心价值在于 “去抽象化”—— 它不堆砌数据库术语,而是通过可运行的代码让每个概念落地。例如 “原子性” 不是理论定义,而是SaveData2函数中 “写临时文件 —fsync— 原子重命名” 的三步操作;“事务隔离” 不是表格中的隔离级别,而是写时复制树的快照与版本号机制。对于 Go 语言开发者而言,书中的代码风格简洁规范,大量使用接口抽象(如页面管理的get/new/del回调)与错误处理,既是数据库学习资料,也是 Go 语言工程实践的范例。 此外,作者还在书中埋下许多 “进阶线索”,如键值对压缩、范围删除优化、网络服务化等,引导读者在基础版本上扩展功能。配套的 “Build Your Own X” 系列(如构建 Redis、编译器)也为读者提供了技术深耕的路径,适合希望从 “使用者” 转变为 “设计者” 的开发者,无论是数据库初学者,还是想深入存储引擎的工程师,都能从这本书中获得 “亲手造轮子” 的成就感与底层认知的突破。