☰
快速上手MiniOB数据库从0到跑通:SQL执行与B+树索引完整指南
2026/10/19 2:49:29 网站建设 项目流程

快速上手MiniOB数据库从0到跑通:SQL执行与B+树索引完整指南

【免费下载链接】miniobMiniOB is a compact database that assists developers in understanding the fundamental workings of a database.项目地址: https://gitcode.com/GitHub_Trending/mi/miniob

MiniOB 是不到 10 万行代码的轻量级数据库项目,提供完整的 SQL 执行流程、B+ 树索引与 MVCC 事务,适合想系统理解数据库内核如何运作的开发者。

项目全貌:MiniOB 的模块划分与数据流向

整体分为三层:网络接入、SQL 处理、存储引擎。客户端 SQL 经 NET 进入,SQL 层依次经过 Parser、Plan Cache、Resolver、Optimizer、Executor,最后由 Executor 访问存储引擎;存储引擎内部包含 Record Manager、Buffer Pool 与 B+ Tree,底下共用元数据管理。

  • 完整 SQL 管线:从词法分析到执行,全程单进程内可跟踪。
  • B+ 树索引:核心索引结构,支持等值查找与范围扫描。
  • MVCC 事务:多版本并发控制,支持读写并发与回滚。
  • 双存储形态:默认行存引擎,另有 LSM-Tree(ObLsm)实验环境。

机制拆解:B+ 树索引如何在页上组织

心智模型:B+ 树索引就是一个多级目录——每页存放一批 key 与页号对,查目录逐层找到数据页,最终得到记录的地址 RID。

结构上分三层理解:

  1. 节点构成:每个节点对应一个页,含公共头(page_num、is_leaf、key_num、parent)与 data 区;
  2. 内部节点:data 为 key 与页号的顺序对,查找时按 key 所属区间选择子节点指针;
  3. 叶子节点:存放索引键加 RID,叶子页之间链接成链,支撑范围扫描。

想深入页分裂、闩锁与日志恢复细节,完整实现位于 src/observer/storage/index/,入口文件是 bplus_tree.cpp 与 bplus_tree_index.cpp。

最小可执行路径:三步完成编译与启动

git clone https://gitcode.com/GitHub_Trending/mi/miniob cd miniob
bash build.sh init
bash build.sh
cd build_debug && ./bin/observer -f ../etc/observer.ini -P cli

参数收敛说明:-f指定配置文件(默认 etc/observer.ini);-P cli直接交互,无需客户端;改成-p 6789则以 TCP 监听端口,另开终端运行./bin/obclient -p 6789连接;并发模式需在编译时加-DCONCURRENCY=ON。

动手实验:用 EXPLAIN 验证索引对单条 SQL 的影响

目标:对同一条 SQL,验证创建索引前后执行计划从全表扫描切换为索引扫描。

  1. cli 模式启动后建表:create table t1(id int, name varchar(20));
  2. 用insert插入几行数据;
  3. 执行explain select * from t1 where name = 'a';记下计划;
  4. 建索引:create index idx_name on t1(name);
  5. 再次执行同一条 explain,对比两次输出。

预期产出:第一次计划的扫描算子为全表扫描 TableScan,建索引后变为索引扫描 IndexScan,且指向 idx_name——这就是索引生效的直接证据。

避坑指南:编译与启动的三个高频问题

build.sh 报$'\r': command not found

  • 现象:脚本第二行报命令不存在,错误信息里带\r;
  • 原因:在 Windows 克隆源码,换行符被转成 CRLF;
  • 解法:执行git config --global core.autocrlf false后重新克隆。

observer 启动提示找不到 libevent.so.2

  • 现象:编译成功,运行即报 cannot open shared object file;
  • 原因:依赖默认装到/usr/local,不在动态库查找路径;
  • 解法:export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH后重新加载 shell。

sudo build.sh init 提示 cmake not found

  • 现象:普通用户能跑 cmake,sudo 后找不到;
  • 原因:sudo 重置了 PATH,不含/usr/local/bin;
  • 解法:去掉 sudo 直接执行 init,或在 /usr/bin 下为 cmake 建软链接。

进阶路线:从 SQL 层到存储引擎的时间轴

  • 第 1~2 周 · SQL 执行链路:通读架构文档 docs/docs/design/miniob-architecture.md,用 gdb 断点跟踪一条 explain 从解析到执行器的完整路径。
  • 第 2~4 周 · 算子与优化:挑一个算子精读,建议从 src/observer/sql/operator/ 下的 hash_join_physical_operator.cpp 入手,这一步也能让你体会数据库内核开发的日常节奏。
  • 第 3 个月起 · 存储引擎实验:在src/oblsm/目录完成 SkipList、Block Cache、Compaction 等子任务,任务定义见docs/docs/db_course_lab/lab1.md。

现在就动手:克隆、编译、跑通第一条 explain,看到你的第一个索引执行计划。

【免费下载链接】miniobMiniOB is a compact database that assists developers in understanding the fundamental workings of a database.项目地址: https://gitcode.com/GitHub_Trending/mi/miniob

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询