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),仅供参考

相关新闻

提示词工程实战:六要素拆解与三步迭代法,写出稳定高质量AI输出

提示词工程实战:六要素拆解与三步迭代法,写出稳定高质量AI输出

写 Prompt 这件事,我前后折腾了至少两年。最开始我以为,提示词不过就是把需求说清楚,“帮我写一段文案”“给这段代码找 bug”,后来才发现这种想法害了不少人。你把一句话丢给模型,模型就只知道这一句话;模…

2026/10/19 6:58:04 阅读更多 →
告别AI金鱼记忆:给OpenClaw接入跨会话永久记忆

告别AI金鱼记忆:给OpenClaw接入跨会话永久记忆

如果你也受够了 AI 的“金鱼记忆”,这个标题里的每一个字,我猜你都会共鸣。我在日常工作里重度依赖自己部署的一个开源对话智能体项目 OpenClaw,前后用了挺长时间,什么都好,唯一让我崩溃的就是它会话切换后彻底失忆——…

2026/10/19 6:58:04 阅读更多 →
基于YOLOv8的水果检测系统:从数据到部署全流程解析

基于YOLOv8的水果检测系统:从数据到部署全流程解析

做水果识别这个项目,起因是有做农业自动化的朋友想给分拣线加个视觉模块,市面上的方案报价高、还捆绑硬件,没办法直接落地。后来我花了几周时间,用YOLOv8从零搭了一套可独立运行的水果检测系统,支持图片、视频、摄像头…

2026/10/19 6:58:04 阅读更多 →

最新新闻

AI原生开发平台架构规划与落地实操指南

AI原生开发平台架构规划与落地实操指南

做技术交流的时候,被问得最多的一个问题,差不多就是标题这句:AI原生开发平台到底是什么、架构怎么规划、怎么落地。说实话,每次回答完我都觉得还有话没说完,因为这三个问题其实是层层递进的——概念不清就谈不上规划&a…

2026/10/19 7:38:21 阅读更多 →
diagram-design:从草图到可维护图示系统的设计方法论

diagram-design:从草图到可维护图示系统的设计方法论

1. 从一张草图到一套系统:diagram-design 到底在解决什么问题第一次听到“diagram-design”这个词,很多人会以为它只是“画图工具”的另一个说法。但真正在项目里摸爬滚打过的人都知道,图这件事从来不是“画出来”那么简单。它背后牵扯的是信…

2026/10/19 7:38:21 阅读更多 →
MCP 三种传输方式全解析:stdio、SSE、Streamable HTTP 选型实战

MCP 三种传输方式全解析:stdio、SSE、Streamable HTTP 选型实战

聊 MCP 的三种传输方式之前,先承认一件事:大多数人在看 MCP 文档的时候,最容易卡住的就是传输层这一节。stdio、SSE、Streamable HTTP 三个词单独拎出来都认识,合在一起却不知道它们为什么同时存在、各自解决什么问题。这不怪你&a…

2026/10/19 7:38:21 阅读更多 →
AI论文降重指令实战:6类提示词破解查重与AIGC检测

AI论文降重指令实战:6类提示词破解查重与AIGC检测

2025年的毕业季明显比前几年多了一道坎:不只是查重率,还多了AI检测。我身边好几个准备答辩的朋友,论文初稿写得很顺,结果一查重,标红一片;好不容易把重复率压下来了,送审前又被提醒“部分段落机…

2026/10/19 7:38:21 阅读更多 →
rea模块开发指南:从命名解析到高复用架构设计与性能优化

rea模块开发指南:从命名解析到高复用架构设计与性能优化

1. 从“rea”这个标题说起:一个被低估的通用缩写第一次看到“rea”这个标题的时候,我脑子里蹦出来的第一反应是——这大概率又是一个被缩写玩坏了的项目名。在技术圈混久了你会发现,越是短到只有三个字母的标题,背后藏的东西往往越…

2026/10/19 7:38:21 阅读更多 →
diagram-design:从设计令牌到语义化图表的系统化设计方法

diagram-design:从设计令牌到语义化图表的系统化设计方法

1. 从一张草图到一套系统:diagram-design 到底在解决什么问题第一次听到 “diagram-design” 这个词,很多人会以为它只是“画图工具”的另一个说法。但真正在项目里被图表折磨过的人知道,问题从来不是“画不出来”,而是“画得乱、…

2026/10/19 7:37:20 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →