news 2026/2/23 16:18:44

DeepSeek总结的SNKV — 无查询处理器的 SQLite 键值存储

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek总结的SNKV — 无查询处理器的 SQLite 键值存储

原文地址:https://github.com/hash-anu/snkv

SNKV — 无查询处理器的 SQLite 键值存储

概述

SNKV是一个轻量级、高性能、ACID 兼容的键值存储,直接构建在SQLite B‑Tree 层之上。

与通过 SQL 查询使用 SQLite 不同,SNKV绕过了整个 SQL 处理栈,直接调用 SQLite 的生产就绪的 B‑Tree API来执行键值操作。

其结果是:一个保留了SQLite 久经考验的可靠性和持久性的数据库,同时由于开销显著减少,在混合 KV 工作负载(70% 读,20% 写,10% 删除操作)上性能提升约 50%


设计理念

SQLite 是一个优秀的通用数据库,但对于键值工作负载而言,它带来了显著的开销:

  • SQL 解析和编译
  • 虚拟机执行
  • 查询优化和模式管理

SNKV 完全移除了这些层,只保留对键值存储至关重要的部分。

使用方法

SNKV 公开了一个简单的 C API 用于键值操作,完全不涉及任何 SQL。

一个完整的端到端使用示例在snkv/main.c中提供。

该文件演示了:

  • 打开数据库
  • 创建列族
  • 插入 / 查询 / 删除操作
  • 事务操作
  • 正确清理和关闭

请查阅 示例 以获取有关 API 使用的更多信息。

测试

所有单元测试和基准测试都位于tests/目录中。

架构对比图示

我们移除了哪些层

┌─────────────────────────────────────────────────────────────────────────────┐ │ 我们移除的栈 │ └─────────────────────────────────────────────────────────────────────────────┘ 从 SQLite 中移除的层 为什么 SNKV 不需要它们 ═══════════════════════ ═══════════════════════════ ┌──────────────────────────┐ │ SQL 接口层 │ 无 SQL → 不需要 │ - sqlite3_prepare() │ │ - sqlite3_step() │ │ - sqlite3_bind_*() │ └──────────────────────────┘ │ ▼ ┌──────────────────────────┐ │ SQL 编译器 │ 无 SQL → 无需解析或代码生成 │ - 分词器 │ │ - 解析器 │ │ - 代码生成器 │ └──────────────────────────┘ │ ▼ ┌──────────────────────────┐ │ 虚拟机 │ 无字节码执行 │ - VDBE 执行器 │ │ - 操作码解释器 │ │ - 200+ 操作码 │ └──────────────────────────┘ │ ▼ ┌──────────────────────────┐ │ 后端层 │ 无模式或查询规划 │ - 查询优化器 │ │ - 索引管理器 │ │ - 模式管理器 │ └──────────────────────────┘ │ ▼ ═══════════════════════════════════════════════════

SNKV 保留了什么(保持不变)

SNKV 有意地保留了SQLite 中经受最多实战考验的部分,且未作改动:

┌──────────────────────────┐ ┌──────────────────────────┐ │ B-树引擎 │ ══════════▶ │ B-树引擎 │ │ (SQLite 已验证代码) │ 保留此项 │ (相同的已验证代码) │ └──────────────────────────┘ └──────────────────────────┘ │ │ ▼ ▼ ┌──────────────────────────┐ ┌──────────────────────────┐ │ 分页模块 │ ══════════▶ │ 分页模块 │ │ (缓存,日志) │ 保留此项 │ (相同代码) │ └──────────────────────────┘ └──────────────────────────┘ │ │ ▼ ▼ ┌──────────────────────────┐ ┌──────────────────────────┐ │ 操作系统接口 │ ══════════▶ │ 操作系统接口 │ │ (文件 I/O,锁) │ 保留此项 │ (相同代码) │ └──────────────────────────┘ └──────────────────────────┘

这意味着 SNKV 受益于:

  • 崩溃安全性(回滚日志)
  • 原子提交
  • 页面缓存和高效 I/O
  • 经过实际测试

清晰的架构图

┌────────────────┐ │ 应用程序 │ └────────┬───────┘ │ │ kvstore_put(key, value) │ kvstore_get(key) → value │ kvstore_delete(key) │ kvstore_begin(), kvstore_commit(), kvstore_rollback(), ... ▼ ┌────────────────────────────────┐ │ KVStore 层 │ │ (薄封装 - 约 1600 行代码) │ │ │ │ • 简单 API │ │ • 列族 │ │ • 线程安全(互斥锁) │ │ • 验证 │ │ • 统计 │ └────────────┬───────────────────┘ │ │ 直接调用(无 SQL!) │ ▼ ┌────────────────────────────────┐ │ B-树引擎 │ │ (SQLite 3.3.0 - 已验证代码) │ │ │ │ • 树操作 │ │ • 键值存储 │ │ • 游标与导航 │ └────────────┬───────────────────┘ │ │ ▼ ┌────────────────────────────────┐ │ 分页模块 │ │ (SQLite 3.3.0 - 已验证代码) │ │ │ │ • 事务管理 │ │ • 回滚日志 │ │ • ACID 保证 │ └────────────┬───────────────────┘ │ │ ▼ ┌────────────────────────────────┐ │ 操作系统接口 │ │ (SQLite 3.3.0 - 已验证代码) │ │ │ │ • 文件 I/O │ │ • 文件锁 │ │ • 崩溃恢复 │ └────────────┬───────────────────┘ │ │ ▼ ┌──────────────┐ │ 磁盘文件 │ │ │ │ • kvstore.db│ │ • journal │ └──────────────┘

结果

相同的可靠性,更少的层,显著更快的 KV 性能。

  • 无 SQL 解析或规划
  • 无虚拟机执行
  • 直接 B‑Tree 访问

典型收益:

  • 更低的内存使用量
  • 可预测的延迟

与最新 SQLite 的对比

下表显示了在相同工作负载(50,000 条记录)下,SQLite(基于 SQL 的 KV 访问)SNKV(直接 B‑Tree KV 访问)各 5 次运行的平均性能。

所有数字均为每秒操作数

基准测试SQLite (平均)SNKV (平均)胜出者
顺序写入68,50370,888SNKV (+3.5%)
随机读取48,20636,210SQLite (+33%)
顺序扫描1,089,0492,173,141SNKV (约 2 倍)
随机更新47,33947,297持平
随机删除31,93744,046SNKV (+38%)
存在性检查59,88436,041SQLite (+66%)
混合工作负载 (70读/20写/10删)50,37978,860SNKV (+56%)
批量插入(单事务)104,526133,566SNKV (+28%)

关键观察

  • SNKV 在写密集和混合工作负载中占优,因为零 SQL/VDBE 开销。
  • 顺序扫描在 SNKV 中快约 2 倍,得益于直接游标遍历。
  • SQLite 在点查询(读取/存在性检查)中胜出,因为它有高度优化的 VDBE 快速路径和语句缓存。
  • 更新性能基本持平(相同的 B‑Tree + 分页路径)。

基准测试代码

  • SQLite 基准测试源码:https://github.com/hash-anu/sqlite-benchmark-kv
  • SNKV 基准测试源码:snkv/tests/test_benchmark.c

何时使用 SNKV

SNKV 适用于:

  • 嵌入式系统
  • 低内存环境
  • 配置存储
  • 元数据库
  • 需要快速 KV 访问的 C/C++ 应用
  • 不需要SQL 的系统
  • 以及更多场景

如果你需要连接、即席查询或分析功能 — 使用 SQLite。
如果你需要快速、可靠的键值存储— 使用 SNKV。


总结

SNKV 证明了一个简单的理念:

如果不需要 SQL,就不要为它付出代价。

通过直接建立在 SQLite 的 B‑Tree 引擎之上,SNKV 交付了一个专注、快速且可靠的键值数据库,同时保持了极低的复杂度。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/22 2:01:42

linux编译报错

/usr/bin/ld: 找不到 -lncursesw $:~/workspace/kernel-driver/linux-xlnx-xlnx_rebase_v5.4_2020.2$ make menuconfig HOSTLD scripts/kconfig/mconf /usr/bin/ld: 找不到 -lncursesw# 解决 $:sudo ln -s /usr/lib/x86_64-linux-gnu/libncurses.so /usr/lib/x86_64-linux-gn…

作者头像 李华
网站建设 2026/2/16 13:46:48

基于Spring Boot的人格测试网站

🍅 作者主页:Selina .a 🍅 简介:Java领域优质创作者🏆、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行交流合作。 主要内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据…

作者头像 李华
网站建设 2026/2/24 1:26:31

【无人机】根据任务需求(紧急程度、飞行距离、是否需冷链)智能筛选最优无人机,为选中的无人机生成平滑的 7 次多项式飞行轨迹附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

作者头像 李华
网站建设 2026/2/15 16:08:47

守护 AI 资产:用 `cann-security-kit` 实现安全可信的模型部署

守护 AI 资产:用 cann-security-kit 实现安全可信的模型部署 cann组织链接:https://atomgit.com/cann ops-nn仓库链接:https://atomgit.com/cann/ops-nn 在金融、医疗、政务等高敏感场景中,AI 模型不仅是算法成果,更是…

作者头像 李华