ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

从 relly 看 RDBMS:一张图理清关系型数据库的完整架构

从 relly 看 RDBMS:一张图理清关系型数据库的完整架构 从 relly 看 RDBMS一张图理清关系型数据库的完整架构【免费下载链接】rellyRDBMS のしくみを学ぶための小さな RDBMS 実装项目地址: https://gitcode.com/gh_mirrors/re/relly提到关系型数据库RDBMS很多人第一反应是 MySQL、PostgreSQL 这些动辄百万行代码的庞然大物很难从零读懂。relly 正是为解决这个问题而生——一个用于学习 RDBMS 原理的迷你关系型数据库实现用 Rust 编写代码量精简到可以通读却完整覆盖了存储引擎、缓冲池、B 树索引、元组编码和查询执行等核心环节。本文将以 relly 为解剖样本帮你用一张图理清关系型数据库的完整架构从磁盘到查询层层拆解。一张表看懂关系型数据库的五大核心模块在深入代码之前先建立整体认知。一个典型的关系型数据库架构可以自上而下拆成五层层级核心职责relly 中的实现查询执行层扫描、过滤、索引查找src/query.rs表与元组层记录组织与编码src/table.rs、src/tuple.rs索引层B 树存储与检索src/btree/缓冲池层页面缓存与置换src/buffer.rs磁盘管理层页面读写与分配src/disk.rs 理解这张分层图你就掌握了 80% 的数据库原理框架。接下来我们自底向上逐层看 relly 是如何实现的。第一层磁盘管理——数据如何在底层落盘所有数据最终都要存到硬盘上。关系型数据库不直接读写行而是以固定大小的**页面Page**为单位。relly 中每个页面的大小是 4096 字节PAGE_SIZE磁盘文件被抽象成一个堆文件页面按编号顺序排列。src/disk.rs 中的DiskManager只做三件事allocate_page分配新页面编号read_page_data/write_page_data按页号定位并读写数据sync把数据真正落盘这是关系型数据库架构中最朴素的起点一切持久化最终都是对页面的读写。第二层缓冲池——数据库的内存缓存如果每次读写都直接访问磁盘性能会惨不忍睹。所以 RDBMS 都有一个缓冲池Buffer Pool把热点页面缓存在内存中。src/buffer.rs 中BufferPoolManager负责维护页面号 → 缓冲帧的映射表BufferPool则用类似 Clock 时钟置换算法淘汰不常用的页面对应evict方法。当页面被修改时会标记is_dirty换出时才写回磁盘——这就是经典的延迟写回write-back策略。这也是为什么 MySQL 的innodb_buffer_pool_size越大、数据库往往越快的根本原因。第三层B 树索引——关系型数据库查询的加速引擎索引层是整个存储引擎的灵魂。relly 用一整套模块实现了标准的 B 树src/btree/node.rs区分叶子节点LEAF与分支节点BRANCHsrc/btree/branch.rs内部节点负责按 key 路由到子节点src/btree/leaf.rs叶子节点存放真正的 (key, value) 数据并通过prev/next指针串成链表方便范围扫描src/btree/meta.rs记录根页面编号src/btree.rs对外提供insert、search和迭代器B 树的插入过程很有意思节点满了就分裂split分裂一路向上传播根满了就长高一层——这正是关系型数据库索引自动增长的方式。在 src/btree.rs 的insert_internal中你能完整看到先插叶子、满了分裂、向上传溢出键、根满则新建根的完整流程。以 examples/btree-range.rs 为例只需几行代码就能体验 B 树的范围查询let btree BTree::new(PageId(0)); let mut iter btree.search(mut bufmgr, SearchMode::Key(bGifu.to_vec()))?; while let Some((key, value)) iter.next(mut bufmgr)? { println!({:02x?} {:02x?}, key, value); }第四层表与元组——记录是如何被编码的有了索引还要解决一条记录怎么存的问题。relly 把一行数据拆成**主键key和其余列value**两部分分别编码后存入 B 树。src/tuple.rs通过encode/decode把多列数据编码成可比较的字节串src/table.rsSimpleTable负责基础建表与插入Table更进一步支持多个UniqueIndex唯一索引看到 examples/simple-table-create.rs 你会发现创建一张表、插入几条记录只需要调用create和insert两个方法——但背后其实是 B 树的一次次分裂与合并。第五层查询执行——SQL 背后的秘密最上层是查询执行。relly 实现了经典的关系型数据库火山模型Volcano Model每个执行器都有next()方法逐条吐出元组上层可以自由组合。src/query.rs 提供了四种执行器SeqScan全表顺序扫描配合while_cond实现区间扫描Filter过滤条件跳过不匹配的记录IndexScan先查辅助索引拿主键再回表取完整记录IndexOnlyScan索引覆盖无需回表性能最优 你有没有想过为什么给查询列建了索引就变快因为优化器可以把SeqScan换成IndexScan把全表扫描变成 B 树的快速定位。relly 里的Filter、IndexScan就是这一逻辑的最小可运行模型。如何快速上手运行 relly想亲手体验关系型数据库的底层运行克隆仓库后即可开始git clone https://gitcode.com/gh_mirrors/re/relly cd relly cargo run --example simple-table-create cargo run --example btree-range项目还提供了 examples/ 目录下十余个可运行示例覆盖建表、精确查询、范围查询、大数据量压测等场景配合 README.md 即可按图索骥。唯一的前置要求是安装 Rust 工具链。结语从 relly 看 RDBMS一图胜千言回到开头那张分层图磁盘管理负责持久化缓冲池负责加速B 树负责索引元组负责组织执行器负责查询——这就是关系型数据库完整架构的全部骨架。真实数据库MySQL、PostgreSQL无非是在这五层之上叠加了事务、锁、日志、优化器等更复杂的机制。relly 的价值在于它用不到千行的 Rust 代码把这些黑盒全部变成你能逐行读懂的白盒。无论你是数据库初学者还是想深入理解索引与存储原理的开发者跟着 src/ 目录从下往上读一遍你对关系型数据库的理解都会发生质变。【免费下载链接】rellyRDBMS のしくみを学ぶための小さな RDBMS 実装项目地址: https://gitcode.com/gh_mirrors/re/relly创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表