章节摘要:SQLite 与应用共享同一个进程、同一个堆——这决定了它的内存故事与 MySQL、PostgreSQL 完全不同:没有可以独立扩缩的缓冲池,只有一组要与应用协商的 PRAGMA 预算。本章算清页缓存的账(cache_size 的两种单位与换算),拆解 mmap 与内存上限机制,对照三个引擎的内存架构,最后落到应用层协作:预编译复用与批量写入的实测数字。读完本章,你能为任何一台设备给出有依据的内存配置。
读完本章,你应当能够:
一句金句:服务端数据库的内存是"独占的资产",SQLite 的内存是"合租的分摊"——配置思路从"越大越好"变成"与应用协商出一个不相互踩踏的边界"。
7.1 页缓存与 PRAGMA 算术:页缓存的位置与淘汰、cache_size 的单位换算(正数按页、负数按 KB 的经典陷阱)、按移动端到重载服务分档的配置基线,以及命中率与点查延迟的量级对照,附一个完整的预算推导实例。
7.2 mmap 与三库内存架构:mmap_size 的机制与边界(只加速读、不占堆、网络盘禁用),软堆上限与内存让路机制,对照 InnoDB 缓冲池与 PostgreSQL 双层内存的架构差异,附嵌入式内存预算的推导算式与迁移参数对照表。
7.3 应用层协作与批量写入:预编译复用与大事务的实测对比(单条提交对批量提交的三个数量级差距),temp_store 与排序峰值的选择,内存告警的三步降级动作。
三节从"内核预算"走到"架构对照"再走到"应用协作"。7.1 立起页缓存这根柱子(所有读路径的终点),7.2 把 SQLite 的内存观放进三库坐标系,7.3 证明内存配置的价值最终要通过应用层的写法兑现——缓存再大,逐条提交照样慢;语句不复用,缓存命中也白搭:
7.1 页缓存预算 ──▶ 7.2 三库内存观 ──▶ 7.3 应用层兑现 内核怎么花 别人怎么花 你的代码怎么配合 │ ▼ 第8章:内存与日志的配置如何影响备份恢复窗口
前置:第 2 章的页概念(缓存的对象就是它);第 4 章的事务与 WAL(脏页、检查点与缓存的关系在那章埋了伏笔)。
后续延伸:第 8 章的备份窗口与本章的缓存大小直接相关(缓存越大,备份前的静默协调越重要);附录的 PRAGMA 速查表是本章内容的浓缩版。带着问题读:为什么 SQLite 官方文档说"多数应用根本不需要调 cache_size"?
读前自测:如果 cache_size 的正负两种取值你还不确定单位差别,先读 7.1 再往下走——本章的预算算术全部建立在这个细节上,它也是真实项目里出现频率最高的配置错误。