土法炼钢兴趣小组的算法知识备份

【SQLite 内核】选型与阅读地图:SQLite vs PG vs DuckDB vs RocksDB

文章导航

分类入口
databasestorage
标签入口
#sqlite#postgresql#duckdb#rocksdb#engine-selection#embedded#reading-map

目录

本系列从 嵌入式行存全景 写到 文件格式与 PagerB-Tree 与 VDBEJournal/WAL锁与事务计划器与索引完整性与备份,再到 与 PG/InnoDB 对照。读到这里应能回答:一次 sqlite3_step 如何落到页面、单写者约束如何塑造并发、WAL 与 cp 备份差在哪。

本文是系列第 17 篇(末篇),收束三件事:选型决策树站内阅读地图学术谱系与开放问题

系列状态:全 17 篇已完成(2026-07-18)。规划见 PLAN.md;系列入口见 index.html。不写跨引擎吞吐排名;性能叙事见既有 sqlite-billion-rows


一、选型决策树:先定约束再选引擎

flowchart TD
  START["Need local or server data store"]
  START --> Q1{"Need network multi-writer<br/>SQL service?"}
  Q1 -->|yes| PG["PostgreSQL or InnoDB<br/>server row-store series"]
  Q1 -->|no| Q2{"Need SQL?"}
  Q2 -->|no| ROCKS["RocksDB embedded KV<br/>rocksdb series"]
  Q2 -->|yes| Q3{"Workload mostly analytical<br/>scans and aggregates?"}
  Q3 -->|yes| DUCK["DuckDB embedded OLAP<br/>columnar-engine boundary"]
  Q3 -->|no| Q4{"Accept single-writer<br/>per database file?"}
  Q4 -->|yes| SQLITE["SQLite embedded OLTP<br/>this series"]
  Q4 -->|no| PG

1.1 路径说明

场景 首选 依据
手机 / 桌面 / 边缘设备本地 SQL、测试夹具、单机嵌入状态 SQLite 本系列:单文件、零 IPC、文件级单写者
多客户端网络访问、多写者 OLTP、成熟运维工具链 PostgreSQL / InnoDB postgresql-kernelmysql-innodb
进程内分析、列式扫描、嵌入式 OLAP DuckDB columnar-engine 边界;非本系列深拆对象
只要持久 KV / 迭代器,不要 SQL RocksDB rocksdb
分布式强一致 KV / SQL TiKV / FoundationDB 等 tikv-htapfoundationdb;不在本决策树中心

1.2 何时选 SQLite

1.3 何时不选 SQLite

1.4 机制对照(不是吞吐排名)

flowchart LR
  subgraph sqliteNode ["SQLite"]
    S1["VDBE + Pager"]
    S2["B-Tree pages"]
    S3["Journal or WAL"]
    S1 --> S2 --> S3
  end
  subgraph duckNode ["DuckDB"]
    D1["Vectorized execution"]
    D2["Columnar storage"]
    D1 --> D2
  end
  subgraph rocksNode ["RocksDB"]
    R1["MemTable"]
    R2["SST + compaction"]
    R1 --> R2
  end
  subgraph pgNode ["PG / InnoDB"]
    P1["Server + shared buffers"]
    P2["Row-store + fine locks"]
    P1 --> P2
  end
维度 SQLite PG / InnoDB DuckDB RocksDB
接口 SQL / C API SQL + 网络 SQL 嵌入 KV API
存储 页式 B-Tree 页式行存 列存为主 LSM
写并发 文件级单写者 多写者 分析型嵌入(场景不同) 多线程写(引擎内)
典型部署 应用内嵌 独立服务 应用内嵌分析 应用内嵌或侧车

二、站内阅读地图

flowchart TB
  PERF["sqlite-billion-rows<br/>performance narrative"]
  PG["postgresql-kernel"]
  INNO["mysql-innodb"]
  ROCKS["rocksdb"]
  COL["columnar-engine"]
  subgraph SERIES["This series: SQLite kernel 01-17"]
    A["01-05 storage path"]
    B["06-10 compile journal lock txn"]
    C["11-15 planner attach integrity backup"]
    D["16-17 compare and select"]
    A --> B --> C --> D
  end
  PERF --> A
  PG --> D
  INNO --> D
  ROCKS --> D
  COL --> D
读者目标 建议路径
快速建立坐标系 1 → 3 → 4 → 5 → 8 → 9 → 17
持久化与并发 7 → 8 → 9 → 10 → 14 → 15
查询与索引 5 → 6 → 11 → 12
从 PG/InnoDB 过来 1 → 16 → 8 → 9 → 17
完整通读 1 … 17

与性能单篇:sqlite-billion-rows 回答「约束如何换速度」;本系列回答「路径如何组织」。与 FDB 历史借用:foundationdb/12 只作 B-Tree 谱系旁注。


三、全系列学术谱系与开放问题

3.1 谱系总表

主题 奠基 / 代表 work 本系列落点
页式有序索引 Bayer & McCreight, 1972 第 2、4 篇
LSM 分叉 O’Neil et al., 1996 第 4、17 篇 vs RocksDB
隔离词汇 Berenson et al., SIGMOD 1995 第 10、16 篇
工程规范 SQLite file format / WAL / locking 第 2–10、14–15 篇
嵌入式 SQL 现状 Gaffney et al., PVLDB 2022 第 1、11、17 篇

3.2 仍开放(本系列标注但不关闭)

  1. 单写者 vs 细粒度页锁:正确性与实现复杂度的长期权衡(第 1、9、10、16 篇)。
  2. WAL checkpoint 与读放大:策略随 workload 变,无统一「最佳 PRAGMA」(第 8 篇)。
  3. 嵌入式 OLTP vs 嵌入式 OLAP:SQLite 与 DuckDB 分工,而非互相替代(PVLDB 2022;columnar-engine)。
  4. ATTACH 跨库与 WAL 原子性边界:多文件事务的裂缝(第 13 篇)。

常见误解

  1. 「SQLite 能替代 PostgreSQL,只要数据不太大。」
    数据量只是一维;写并发与网络多租户往往先撞墙。

  2. 「DuckDB 是更快的 SQLite。」
    列存分析与行存 OLTP 假设不同;选错负载会双输。

  3. 「RocksDB + 自研 SQL 就等于 SQLite。」
    缺的是优化器、事务 SQL、类型系统与几十年文件格式兼容——成本在工程,不在「再写一层解析器」的口号。

  4. 「选了 SQLite 就不用懂 WAL/锁。」
    备份、SQLITE_BUSY、损坏恢复全落在这些机制上(第 8–10、14–15 篇)。


四、小结

三句话小结

  1. 选型先问:要不要网络多写者 SQL、要不要分析扫描、要不要 SQL 本身——再落到 PG·InnoDB / DuckDB / SQLite / RocksDB。
  2. SQLite 的生态位是嵌入式行存 OLTP:单文件、零 IPC、文件级单写者;本系列补的是从页到备份的内核路径。
  3. 单写者、checkpoint、OLTP/OLAP 分工、ATTACH 边界仍是开放问题;后续以官方 release note 与顶会系统论文跟踪即可。

感谢读完本系列。SQLite 内核系列至此完结。

若从本篇决策树选中了 SQLite,建议从 系列目录 的「必读核心」路径回读机制篇,而不是只收藏选型表。


参考资料

规范与官方文档(A 级)

  1. SQLite ArchitectureWhen to use SQLiteWALIsolationBackup API
  2. DuckDB 官方文档(选型边界,B/A 级视章节)。
  3. RocksDB 官方 wiki / 本站 rocksdb 系列入口。

论文(A 级)

  1. Bayer & McCreight, 1972;O’Neil et al., 1996;Berenson et al., SIGMOD 1995。
  2. Gaffney et al., SQLite: Past, Present, and Future, PVLDB 15(12), 2022. DOI: 10.14778/3554821.3554842。

站内

  1. 本系列 01–16PLAN.md
  2. postgresql-kernelmysql-innodbcolumnar-enginerocksdb
  3. sqlite-billion-rows第 16 篇对照

上一篇与 PG / InnoDB 机制对照

感谢读完本系列。SQLite 内核系列至此完结。 系列入口与阅读路径以 index.html 为准。

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。

2026-07-07 · database / storage

【RocksDB 内核机制】选型与存储栈阅读地图

用决策树收束 RocksDB 与 InnoDB、列存、湖仓的适用边界;给出存储引擎三角 + 数据平台全栈阅读地图,对接 query-engine/18 与 postgresql-kernel,并标注 HTAP/TiKV 续作入口。


By .