news 2026/9/16 18:03:01

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/9/11 11:31:38

# [大模型实战 05] 大模型实战的杀手锏: 模型微调

[大模型实战 05] 大模型实战的杀手锏: 模型微调核心摘要 (TL;DR) 实操验证:通过 Kaggle 代码亲自运行对比,揭示 Base 模型(“续写怪”)与 Instruct 模型(“对话助手”)的本质差异。原理揭秘&…

作者头像 李华
网站建设 2026/9/6 7:47:49

可信 AI 实战:基于 CANN `secure-ai-runtime` 的模型加密与安全推理

可信 AI 实战:基于 CANN secure-ai-runtime 的模型加密与安全推理 cann组织链接:https://atomgit.com/cann ops-nn仓库链接:https://atomgit.com/cann/ops-nn 一、为什么 AI 系统需要安全加固? 随着 AI 模型成为企业核心资产&a…

作者头像 李华
网站建设 2026/9/3 2:29:18

CANN-LLM:基于昇腾 CANN 的高性能、全功能 LLM 推理引擎

在上一篇中,我们实现了 毫秒级请求取消机制,使系统具备了生产级的鲁棒性。现在,我们将整合前六篇的所有技术成果,构建一个完整的、可开源的 LLM 推理服务项目模板,命名为: CANN-LLM:基于昇腾 CA…

作者头像 李华
网站建设 2026/9/15 17:41:29

基于Matlab的热成像图像处理系统

- 标题:基于matlab的热成像图像处理系统 - 关键词:matlab GUI界面 数字图像处理 椒盐噪声 高斯噪声 乘性噪声 均值滤波 中值滤波 高通滤波 灰度化 温度异常检测 设置温度阈值 - 步骤:打开图像 选择模糊算法 选择还原算法 对模糊的图像进行还原…

作者头像 李华
网站建设 2026/9/11 6:21:26

MoeKoeMusic v1.5.9:高颜值酷狗第三方客户端

MoeKoeMusic v1.5.9 绿色版是一款优质的酷狗音乐第三方客户端,依托 Vue.js 全家桶开发且直连酷狗官方服务器,既支持多方式账号登录,又拥有丰富的音乐功能与个性化设置,还能实现 VIP 自动领取,为广大用户打造出纯粹的高…

作者头像 李华
网站建设 2026/9/10 18:39:42

java大文件上传处理

Java 大文件上传处理(从简单到生产级完整方案) 在实际项目中,上传几百MB甚至几个GB的文件非常常见。如果直接用普通的 MultipartFile 一次性接收,会导致以下问题: 内存溢出(OutOfMemoryError)…

作者头像 李华