资讯详情

1 条 SQL 跑通 MiniOB 数据库:从构建、启动到看懂执行链路

📅 2026/10/19 6:59:20 | 华诺云谱 👁 阅读
1 条 SQL 跑通 MiniOB 数据库:从构建、启动到看懂执行链路
1 条 SQL 跑通 MiniOB 数据库从构建、启动到看懂执行链路【免费下载链接】miniobMiniOB is a compact database that assists developers in understanding the fundamental workings of a database.项目地址: https://gitcode.com/GitHub_Trending/mi/miniob你刚 clone 下一个教学数据库不知道从哪一行代码看起也不确定自己环境能否把它编译起来。MiniOB 数据库就是为这个场景准备的它是 OceanBase 团队开发的 C 教学数据库代码量不到 10 万行把 SQL 解析、查询优化、执行计划和 B 树索引都放在了你能读完的规模里。这篇文章带你完成一次编译、一次启动并沿一条 SELECT 语句走完它的内部链路。MiniOB 数据库是什么适合谁上手MiniOB 的定位一句话一个可以读源码、改模块、跑测试的关系数据库用来把数据库内核的模块分工讲清楚。它有意简化了并发、安全等工程复杂度所以判断标准不是能不能生产而是模块边界是否清晰。适合不适合在校生、想补齐数据库内核知识的开发者寻找生产环境可用数据库的团队参加 OceanBase 相关赛事完成配套实验题目对高并发、强一致性有实际要求的业务想读懂 B 树索引、LSM-Tree、MVCC 的实现期望完整事务隔离与权限体系的学习者学习 Flex/Bison 词法语法分析与算子实现只想用 SQL 而不想碰 C 编译的同学架构上它分成四层官方设计文档里有完整模块说明docs/design/miniob-architecture.md网络层收发请求Parser 把 SQL 变成语法树Resolver、Optimizer 生成执行计划Executor 驱动算子取数存储引擎由 Buffer Pool、Record Manager 和 B 树组成。你要学的就是这条主线。MiniOB 最快构建方式clone、init、build 三步这条路径来自仓库的 docs/how_to_build.md前置条件cmake 3.13、gcc 11 或 clang 14需支持 C20、flex 2.5 和 bison 3.7。克隆代码。init要用 git submodule 拉取依赖必须先拿到完整仓库。git clone https://gitcode.com/GitHub_Trending/mi/miniob cd miniob初始化依赖。这一步把 libevent、googletest、benchmark、jsoncpp、replxx 编译安装到源码目录下的deps/3rd/usr/local只需要执行一次。bash build.sh init编译并首次启动。build.sh默认生成 Debug 版本产物在build_debug/bin下。bash build.sh cd build_debug ./bin/observer -f ../etc/observer.ini -P clicli是交互模式不需要客户端单线程处理所有请求。启动后依次输入下面的 SQL看到查询结果说明链路已通create table t1(id int, age int); insert into t1 values(1, 10); select * from t1 where id 1;想开多客户端连接时改用 TCP 模式./bin/observer -f ../etc/observer.ini -p 6789另开终端运行./bin/obclient -p 6789详见 docs/how_to_run.md。MiniOB SQL 执行流程一条请求如何走到存储引擎上面那三条 SQL 为什么能返回正确结果看这条链路你就懂了。现象你输入一条 SELECT客户端收到结果集中间没有任何交互。过程网络层把 SQL 文本读成事件对象后SqlTaskHandler依次调用 query cache 命中检查、parse_stage、resolve_stage、optimize_stage、execute_stage最后由 communicator 把结果写回连接。这段代码不绕弯就是责任链的线性调用。源码在哪链路入口在 src/observer/net/sql_task_handler.cpp 的handle_sql函数词法语法定义在 src/observer/sql/parser/lex_sql.l 与 yacc_sql.y优化器生成的物理算子在 src/observer/sql/operator/。官方时序图见 docs/design/miniob-sql-execution-process.md。执行计划的末端是存储引擎。表数据按记录组织在数据文件里Record Manager而你在建表时声明的primary key会自动落成一棵 B 树索引所有键值存在叶子页中叶子页之间互相链接这就是范围扫描快的原因优化器正是依据条件列上有没有索引来决定物理算子的点查走索引扫描否则退化为全表扫描。30 分钟动手实验用 explain 观察优化器选算子这个任务不需要改代码全部在编译产物里完成预计 30 分钟。cd build_debug ./bin/observer -f ../etc/observer.ini -p 6789 ./bin/obclient -p 6789create table t2(id int primary key, name char(20)); insert into t2 values(1, a), (2, b); explain select * from t2; explain select * from t2 where id 1;预期结果第一条 explain 的执行计划是 TABLE_SCAN无 WHERE只能扫全表第二条带等值条件且 id 上有主键索引计划会变成走 B 树索引的扫描算子。两条输出对比着看你就能直观回答优化器为什么这么选。想继续深入test/case/test/basic.test 列出了全部基础 SQL 的行为样例可以逐条对照。常见卡点症状、原因与解法症状原因解法build.sh: line 2: $\r: command not foundWindows 克隆导致换行符变成 CRLF执行git config --global core.autocrlf false后重新克隆运行 observer 提示找不到动态链接库依赖装在deps/3rd/usr/local不在默认查找路径把库目录加入LD_LIBRARY_PATH后重开终端文档 FAQ 有示例cmake 报找不到 Libevent 等依赖高版本 cmake 与依赖库的 cmake 策略不兼容按 docs/how_to_build.md FAQ 放宽对应 CMakeLists 的版本区间重跑bash build.sh init启动 mvcc 事务模式失败当前编译不支持并发重新构建时追加-DCONCURRENCYON即bash build.sh -DCONCURRENCYON延伸方向按你的身份选路线学生路线按实验手册顺序做从 docs/db_course_lab/lab0.md 的 C 基础练起再到 lab1 的 LSM-Tree、lab2 的查询引擎、lab3 的事务引擎每一步都有可提交的验收标准。在职工程师路线只挑一条链路读透。建议从 src/observer/sql/parser/ 的 yacc_sql.y 入手看懂 AST再进入优化器看逻辑计划如何变物理算子约一两周能建立完整心智模型。研究者路线关注存储引擎对比src/oblsm/ 是独立的 LSM-Tree 实现与 B 树路径并存可直接对照 docs/design/miniob-lsm-tree.md。下一步现在就把 observer 跑起来用 explain 对比一次有索引和没索引的执行计划。资源清单架构与模块说明docs/design/miniob-architecture.mdSQL 执行流程时序文档docs/design/miniob-sql-execution-process.md构建与运行指南docs/how_to_build.md、docs/how_to_run.md实验题入口docs/db_course_lab/核心源码src/observer/SQL 与存储、src/oblsm/LSM-Tree 引擎测试与样例test/case/SQL 行为样例、unittest/各模块单元测试【免费下载链接】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),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑