如果你也喜欢数据库内核、存储引擎、WAL、B+Tree、SQL 执行器这些东西,这个项目应该会有点意思。
我最近把一个 Uya-native 的嵌入式文档数据库 NoSQLite 做到了 v1.5.0 里程碑:从文档二进制格式、pager、WAL、checkpoint、recovery,到 SQL parser、planner、executor、二级索引、Typed SQL 静态校验,Phase 0 到 Phase 14 全部封板。
它不是一个 JSON wrapper,而是一个尽量“小而硬”的数据库内核实验。
NoSQLite 是什么?
一句话:
用 Uya 写到底的嵌入式文档数据库,把 JSON 的灵活性、SQL 的可读性、存储引擎的可靠性压到一个小内核里。
当前已经支持:
为什么要写这个?
主要是想把数据库内核里那些“平时只在论文、SQLite 源码或者存储引擎博客里看到的东西”,完整走一遍。
比如:
-
文件头怎么版本化?
-
meta page 怎么双页轮换?
-
WAL 里哪些记录必须能 redo?
-
未提交 WAL 恢复后如何不可见?
-
checkpoint 什么时候安全?
-
reader pin 住旧 view 时 writer 怎么处理?
-
JSON number 怎么避免静默丢精度?
-
SQL 怎么从字符串变成 plan,再变成执行结果?
-
Typed SQL 怎么提前发现 collection、字段和类型错误?
这些东西单独看都不复杂,但串起来以后,才真正有数据库的味道。
当前封板状态
这次里程碑叫:
nosqlite-v1.5.0
完整验收命令:
bash nosqlite/tests/verify_definition_of_done.sh
期望最后输出:
definition of done verification ok
当前 DoD 已通过。压力测试也纳入了封板验收。
压力测试结果
当前压力门不是吞吐 benchmark,而是稳定性压力门,主要验证反复操作后的状态正确性。
覆盖内容包括:
本次运行结果:
PASS run-only elapsed: 4.384787 s run-only peak RSS: 82608 KiB
性能现状
先说实话:现在还是 v0 原型性能基线,不是生产 SLO。
当前 benchmark 使用 3 个平均 1024 bytes 文档的小数据集:
primary_lookup: p50 18583 us, p95 19668 us seq_scan_filter: p50 18251 us, p95 22201 us durable_insert: p50 18918 us, p95 23079 us recovery_open: p50 96121 us, p95 100922 us
汇总:
floor: 5/5 pass target: 2/5 pass stretch: 0/5 pass
所以它现在更像是“数据库内核骨架完整封板”,不是“性能已经能打 SQLite”。
当前边界
也先把边界讲清楚:
我更愿意把它定位成一个“可信的小数据库内核里程碑”,而不是吹成什么替代 SQLite / MongoDB 的东西。
这次我最满意的点
最爽的是,项目最后不是停在“能跑 demo”,而是拉了一条完整封板线:
设计文档 -> 阶段 TODO -> 每阶段测试 -> DoD 验收矩阵 -> 压力测试 -> benchmark 报告 -> release note -> git tag
这让它从一个兴趣项目,变成了一个可以复盘、可以继续演进的小型工程。
后面想做什么?
下一步大概会往这几个方向走:
-
解除单页 collection 容量限制
-
把压力测试扩到 1,000+ 行
-
做 100,000 文档参考集
-
压力测试输出 JSON 化
-
重新定义真正的性能目标
-
继续完善查询优化器和索引能力
最后
如果你对数据库内核、嵌入式存储、WAL、B+Tree、SQL 执行器、或者用小语言写硬核系统软件感兴趣,欢迎围观、拍砖、提建议。
这个项目目前最大的价值不是“它已经能替代谁”,而是:
它把一个数据库内核从 0 到封板验收的完整路径跑通了。