MiniOB 从 0 到 1 完整指南:手把手编译、运行并看懂一个迷你数据库 MiniOB 从 0 到 1 完整指南手把手编译、运行并看懂一个迷你数据库【免费下载链接】miniobMiniOB is a compact database that assists developers in understanding the fundamental workings of a database.项目地址: https://gitcode.com/GitHub_Trending/mi/miniob一提数据库内核你是不是也觉得那是一堆上百万行的 C 代码根本无从下手MiniOB 是 OceanBase 团队做的一个紧凑型关系型数据库用不到 10 万行 C 代码就把 SQL 解析、查询优化、B 树索引、缓冲池、事务日志这些听起来很唬人的模块装进了一个可读性很高的工程里。这篇文章带你从零把 MiniOB 编译起来、跑起来再用一条 SELECT 语句讲清楚它内部到底发生了什么。MiniOB 项目速览一套足够小、又足够完整的数据库内核 先看几个关键数字和事实帮你判断它值不值得花时间代码量克制整个项目源码不到 10 万行主逻辑集中在src/observer/一个目录里一个人一两周就能通读骨架这是读 MySQL 源码做不到的。模块边界清晰src/observer/sql/管解析、优化和执行src/observer/storage/管 B 树索引、缓冲池、记录管理和日志src/observer/net/管网络通信每个目录职责单一改一处基本不会牵动全局。核心功能不缺席建表建索引、增删改查、范围扫描、事务支持 MVCC、MySQL 协议通信都实现了它不只是个教学 demo而是一个能真正用起来的数据库。实验与测试配套unittest/下有各模块的单元测试test/case/下有 SQL 回归用例docs/docs/db_course_lab/里有 LSM-Tree、查询引擎、事务引擎等由浅入深的实验题学完马上有地方练手。看图时重点关注三层最上面是客户端与服务端的通信中间是 SQL 处理流水线最下面是存储引擎缓冲池 索引 记录管理后面两条主线章节会分别沿着中间和下面走。如何从零跑通 MiniOB3 步完成编译与启动 第一步拿到源码只需两条命令仓库地址如下# 克隆 MiniOB 源码并进入项目目录 git clone https://gitcode.com/GitHub_Trending/mi/miniob cd miniob第二步初始化依赖并编译首次编译需要先执行init拉取并编译第三方依赖会装到deps/3rd/下不污染系统环境这一步耗时较长可以先去泡杯茶# 首次编译安装第三方依赖 bash build.sh init # 编译 debug 版本默认产物在 build_debug/ 下 bash build.sh如果编译报 flex/bison 相关错误通常是版本太老参考docs/docs/how_to_build.md的 FAQ 一节处理。第三步启动服务端连上客户端编译完成后一个终端起服务另一个终端连进去你会发现交互方式和 MySQL 客户端几乎一样# 终端 1启动服务端监听 6789 端口 build_debug/bin/observer -f etc/observer.ini -p 6789 # 终端 2启动客户端连接服务端 build_debug/bin/obclient -p 6789连上后先别急着看源码直接敲几条 SQL 感受一下-- 建表、写入、查询验证环境没问题 CREATE TABLE t1 (id INT PRIMARY KEY, name VARCHAR(32)); INSERT INTO t1 VALUES (1, miniob), (2, learner); SELECT * FROM t1 WHERE id 1;跑通了这一步你就已经比大多数只下载没编译的人领先了。MiniOB 的 SQL 执行流程拆解一条 SELECT 的完整旅程 来试试在客户端执行这条语句SELECT * FROM t1 WHERE id 1;它到达服务端后会沿着一条清晰的流水线走一遍整个过程由src/observer/session/session_stage.cpp里的责任链驱动接收请求输入是 TCP 连接上的 SQL 文本src/observer/net/下的线程模型把请求包装成事件交给任务处理器输出一个绑定好会话的SessionEvent。Parse 解析Flex 做词法分析、Bison 做语法分析词法规则在src/observer/sql/parser/下的.l和.y文件里输入 SQL 字符串输出 Stmt 语句树。Resolve 语义分析检查表名、列名是否存在类型是否匹配输入 Stmt 树输出补全了表和列元信息的语句对象。Optimize 优化把语句转成逻辑算子树再选择物理算子走全表扫描还是索引扫描、用哪种连接输入语句对象输出物理算子树。Execute 执行按算子树的迭代器模型自底向上取数输入物理算子树输出SqlResult结果集最后格式化返回客户端。这张图很长建议重点看中间责任链那一段Session → Parse → Resolve → Optimize → Execute 五个 Stage 的调用顺序正是上面 5 个阶段的可视化。执行阶段往下钻就会碰到存储引擎。当 WHERE 条件能命中索引时走的是 B 树查找关注点非叶子节点只存 key 用于路由真正定位记录靠叶子节点实现代码在src/observer/storage/index/下的bplus_tree.cpp数据页的读写则经过src/observer/storage/buffer/的缓冲池避免每次查询都直接打磁盘。动手小实验对比两种连接算子的执行方式 ️只读代码理解不了的东西跑一遍对比就知道了。MiniOB 内置了嵌套循环连接和哈希连接两种算子做个对比实验建两张表各插入几百行数据写一条两表连接查询。用EXPLAIN查看当前查询走了哪个连接算子src/observer/sql/operator/explain_physical_operator.cpp。打开nested_loop_join_physical_operator.cpp和hash_join_physical_operator.cpp重点看各自的open()方法——构建阶段和探测阶段分别在哪儿。改一条连接条件比如把等值连接改成不等值连接重新编译运行观察 EXPLAIN 输出和执行结果的变化。做完这个实验你会真正理解优化器选算子不是玄学等值连接适合哈希表探测不等值条件只能退化成逐对比较这层直觉是面试和设计查询引擎时最实用的东西。图中构建阶段把小表放入哈希表、探测阶段扫大表逐个匹配的过程和hash_join_physical_operator.cpp里的实现是一一对应的。进阶路线按三个深度阶段走 第一阶段1~2 周· 读得懂架构通读docs/docs/design/miniob-architecture.md和miniob-bplus-tree.md把unittest/observer/下的bplus_tree_test.cpp、record_manager_test.cpp跑起来改一条 SQL 触发断点跟一遍解析流程。第二阶段2~4 周· 动得了存储做docs/docs/db_course_lab/的 LAB#1LSM-Tree 存储引擎和 LAB#3事务引擎重点啃src/observer/storage/trx/的 MVCC 日志实现和src/oblsm/这套独立的 LSM 引擎。第三阶段1 个月· 玩得转查询引擎完成 LAB#2查询引擎尝试给优化器加一条新的规则或加一个新算子并用test/case/的回归用例保证没改坏。只完成第一阶段也完全 OK你已经能独立讲清一个数据库是怎么工作的了。常见坑与排错先查这 4 个问题 Q执行sudo bash build.sh init时报cmake: command not foundAinit 脚本在 sudo 环境下走了不同的 PATH先确认cmake --version正常再避免在 sudo 下执行 init文档docs/docs/how_to_build.md的 FAQ 有更完整的处理。Qobserver 启动时报error while loading shared librariesA依赖库装在了默认前缀目录下运行时找不到。用下面这行把查找路径加上即可# 将依赖库路径加入动态链接库查找路径 export LD_LIBRARY_PATH/usr/local/lib64:$LD_LIBRARY_PATHQ想试多连接并发场景发现同时只能跑一个请求A默认编译不支持并发编译时加上参数bash build.sh -DCONCURRENCYON再启动服务端就支持多连接了详见docs/docs/how_to_run.md。QWindows 下编译各种奇怪报错A先用 WSL2 或 Docker 容器跑别在原生 Windows 上硬试如果坚持用 Git Bash先执行git config --global core.autocrlf false防止脚本换行符被改坏。资源导航与下一步架构与模块文档docs/docs/design/B 树、缓冲池、事务、线程模型都有专篇编译与运行手册docs/docs/how_to_build.md、docs/docs/how_to_run.md课程实验题docs/docs/db_course_lab/LAB#0~LAB#4从 C 基础到性能测试核心源码src/observer/sql/SQL 流水线、src/observer/storage/存储引擎、src/oblsm/LSM-Tree 引擎测试用例unittest/单元测试、test/case/SQL 回归测试数据库内核没有传说中那么神秘它就是一个把磁盘上的字节变成你查询结果的流水线。今天就可以做的第一步克隆仓库跑通bash build.sh init和bash build.sh然后敲下你的第一条CREATE TABLE。跑起来的那一刻这条路就算正式开始了 【免费下载链接】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),仅供参考