快速上手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。
结构上分三层理解:
- 节点构成:每个节点对应一个页,含公共头(page_num、is_leaf、key_num、parent)与 data 区;
- 内部节点:data 为 key 与页号的顺序对,查找时按 key 所属区间选择子节点指针;
- 叶子节点:存放索引键加 RID,叶子页之间链接成链,支撑范围扫描。
想深入页分裂、闩锁与日志恢复细节,完整实现位于 src/observer/storage/index/,入口文件是 bplus_tree.cpp 与 bplus_tree_index.cpp。
最小可执行路径:三步完成编译与启动
git clone https://gitcode.com/GitHub_Trending/mi/miniob cd miniobbash build.sh initbash build.shcd 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,验证创建索引前后执行计划从全表扫描切换为索引扫描。
- cli 模式启动后建表:
create table t1(id int, name varchar(20)); - 用
insert插入几行数据; - 执行
explain select * from t1 where name = 'a';记下计划; - 建索引:
create index idx_name on t1(name); - 再次执行同一条 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),仅供参考