先给结论
如果你做的是 读多写少、数据模型相对清晰、并且想和 Workers/Pages 深度集成 的应用,Cloudflare D1 是一条很务实的路。
如果你要的是 单库超大容量(TB 级)、高写入并发、复杂数据库运维能力(例如成熟的扩展生态和传统 DBA 工具链),D1 往往不是最优解,至少不该是唯一数据库。
一句话总结:D1 更像“边缘应用的轻量 SQL 引擎”,而不是“替代所有关系型数据库的终极方案”。
D1 是什么(先统一认知)
Cloudflare 官方对 D1 的定位是:
- 托管式、Serverless 数据库
- 采用 SQLite 语义
- 可通过 Workers 绑定和 HTTP API 访问
- 面向多库横向扩展(官方强调每库上限 10 GB,适合 per-user / per-tenant 这类拆分模型)[1][2]
这决定了 D1 的设计哲学:
- 追求“靠近应用”的开发体验,而不是传统数据库那种独立部署和复杂运维。
- 鼓励“多小库”而不是“单大库”。
- 更适合 Web 应用常见的读密集场景。
优点:D1 真正有价值的地方
1) 和 Workers/Pages 结合紧,开发链路短
你可以在 Worker 里直接用绑定查询 D1,不需要先搭一层独立数据库网关或连接池系统。对于全栈 JavaScript/TypeScript 团队,这个体验很顺手。
从工程角度看,它带来的不是“语法新鲜感”,而是:
- 更少的基础设施拼装
- 更短的上线路径
- 更统一的平台治理(权限、日志、监控、发布)
2) 成本模型直观:按行读写 + 存储计费
D1 的计费按 rows_read、rows_written 和存储来算,并且强调 scale-to-zero(不查库时不按数据库实例时长计费)[3]。
这对中小团队很关键:你不用先为“可能会有的峰值”买固定容量。
3) 内置 Time Travel,备份恢复门槛低
官方文档给出的能力是:
- Time Travel 默认开启
- 可按分钟恢复到过去时间点
- Paid 计划可回溯 30 天,Free 计划 7 天
- 文档写明数据库历史与恢复操作无额外费用 [4][2]
这类“恢复力”对内容系统、后台管理系统非常实用,尤其能降低误删误改后的事故成本。
4) 全球读扩展能力对读密集业务友好
D1 的 Global Read Replication(当前文档仍标注 Beta)可以让读取请求由副本分担,降低远距离读延迟并提升读取吞吐 [5]。
对以下场景很友好:
- 内容展示类网站
- 商品目录/搜索类读多写少场景
- 全球用户分布明显但写入集中度不高的应用
5) SQLite 语义,迁移和上手门槛低
很多团队本来就熟悉 SQLite 语义,D1 兼容大部分 SQLite SQL 约定,并支持常见扩展能力(如 FTS5/JSON 等)[6]。
这意味着你在建模和 SQL 开发上,学习成本不会太高。
缺点:D1 不是不能用,而是有明确边界
1) 单库容量和执行限制是硬约束
官方 Limits 里几个常见约束需要正视 [2]:
- 单数据库最大 10 GB(Paid)/ 500 MB(Free)
- 单条 SQL 最长 100 KB
- 单次查询最长 30 秒
- 单库本质是单线程串行处理查询
所以它不适合“单库越堆越大、超长 SQL 扫全表、重型报表实时跑”的思路。
2) 写入吞吐不是它的优势项
文档明确写到每个 D1 数据库是单线程、一次处理一个查询;请求多会排队,队列满会出现 overloaded 错误 [2]。
这并不等于“D1 不能写”,而是意味着:
- 写密集系统必须非常重视 schema、索引和写入批次设计
- 高并发写业务要提前做分片/拆库策略
- 不能把它当无限线性扩展的写入系统
3) 读副本带来低延迟,也带来一致性语义成本
D1 读副本是异步复制,官方文档明确提到副本在任意时刻可能落后主库。要避免一致性坑,需要使用 Sessions API + bookmark 来获得 sequential consistency [5]。
这意味着团队要额外理解并落实:
- 什么时候允许“不是最新数据”
- 什么时候必须读取主库(
first-primary)
- 如何在会话间传递 bookmark
如果团队对一致性模型不敏感,这里容易出隐性 Bug。
4) 成本优化依赖索引与查询质量
D1 按“读取行数”计费,未命中索引时扫描行数会快速变大,成本和延迟都会受影响 [3]。
简单说:SQL 写得不克制,账单和响应时间会一起恶化。
5) 不是传统大型 RDBMS 的平替
Cloudflare 在存储选型文档里给得很直接:如果你需要单库 1TB/100TB 级规模,或已经有成熟 Postgres/MySQL 体系,建议考虑 Hyperdrive 这类路径 [7]。
所以 D1 的正确打开方式是“按场景补位”,而不是“全量替换”。
你到底适不适合用 D1?
Cloudflare D1 选型 SWOT
S
Strengths
- 平台一体化和 Workers/Pages 集成紧,研发到上线链路短
- 成本按量可控按 rows_read/rows_written 与存储计费,适合流量波动场景
- 恢复能力实用内置 Time Travel,误操作回滚成本更低
W
Weaknesses
- 单库硬上限单库容量和查询执行时长有明确限制
- 写入扩展受限单库单线程执行,写高峰易排队
- 一致性复杂度读副本异步复制,需要会话一致性策略
O
Opportunities
- 全球读优化读副本可降低跨区域读延迟
- 多租户拆库per-tenant 模型可获得更清晰的容量边界
- 边缘全栈方案可与 KV/R2/Queues 组成统一边缘架构
T
Threats
- 误当万能数据库把重写入或超大单库场景硬塞给 D1 会导致架构风险
- 索引治理缺失无索引扫描会放大延迟与账单
- 一致性误用未区分主库/副本读路径会引入隐蔽数据错误
适合(建议优先试)
你满足以下 3 条及以上,D1 通常值得试:
- 业务读多写少,且读延迟对全球用户体验敏感。
- 应用本身就部署在 Workers/Pages,希望减少运维面。
- 数据可按租户/用户/实体拆分,不依赖单库无限增长。
- 团队能接受并正确处理读副本一致性语义。
- 希望成本模型更贴近实际请求量,不想长期预留数据库容量。
不太适合(谨慎)
命中以下任一项,建议把 D1 作为“局部组件”而非主数据库:
- 单库很快超过 10 GB,且拆分成本高。
- 写入吞吐持续很高,业务对写路径排队很敏感。
- 强依赖传统数据库生态能力和现成 DBA 体系。
- 对数据一致性策略没有工程约束,团队容易误用读副本。
- 你已经有稳定、可维护、成本可控的现有数据库架构,迁移收益不足。
一个更实用的决策框架(5 分钟)
Cloudflare D1 选型流程图
1
Step 1 看读写比例
读多写少可进入下一步;写入高并发建议优先评估传统 RDBMS
2
Step 2 看数据规模
可拆成多库且单库不追求超大容量,D1 更匹配
3
Step 3 看一致性要求
若能接受副本滞后并落实 Sessions API,可继续推进
4
Step 4 小范围上线验证
先迁移读密集模块,监控 rows_read 与查询耗时后再扩大范围
上线前可以快速问自己 5 个问题:
- 我的核心流量是读多还是写多?
- 业务模型能否天然拆分成多个小数据库?
- 是否需要单库 TB 级增长?
- 团队是否理解并能正确落地 Sessions API 一致性策略?
- 是否愿意把索引治理和 SQL 观测当成日常工程纪律?
如果答案是:
是/是/否/是/是:D1 很可能是高性价比选项。
否/否/是/否/否:大概率应优先考虑传统 Postgres/MySQL 路线(可结合 Hyperdrive)。
落地建议(如果你准备开始用)
- 先从读密集、低风险模块切入,不要一上来全站迁移。
- 建立 SQL 审查规则,避免无索引扫描。
- 打通
rows_read、rows_written、查询耗时监控,按周复盘。
- 对写操作和可重试操作实现幂等策略,结合退避重试 [8]。
- 使用 Sessions API 明确“要最新”与“可接受滞后”两类读取路径 [5]。
- 预先规划拆库模型(tenant/user/entity),别等 10 GB 再被动重构 [2][7]。
- 对数据主权有要求的项目,在建库阶段就设置 jurisdiction(创建后不能改)[9]。
结语
Cloudflare D1 的问题从来不是“能不能用”,而是“你是否用在了它擅长的地方”。
它非常适合边缘应用里的轻量关系型需求,也能明显降低一部分数据库运维负担。但只要你的业务开始向“重写入、单库超大、复杂数据库工程”演化,就要及早准备混合架构,而不是强行把 D1 拉去做它不擅长的事。
选型的关键不是追新,而是匹配业务约束。
References