Firestore Bundles是否比常规查询成本更高?
Firestore查询与数据包的获取成本差异案例研究
- Firestore查询(Firestore Queries)
- Firestore数据包(Firestore Bundles)
Firestore数据包是Firestore推出的预打包数据功能,可将指定查询结果提前打包存储,供客户端直接下载使用。
测试环境
某集合包含1282个文档,每个文档包含6个属性:
- subject_name:字符串(string)
- subject_code:字符串(string)
- date:时间戳(Timestamp)
- last_updated:时间戳(Timestamp)
- id:字符串(string)
- course_count:数字(number)
1. Firestore查询成本计算
参考Firestore官方定价,以法兰克福(Europe-west3)区域为基准,忽略网络出站数据传输成本:
- 每100,000次文档读取费用为0.039美元
单用户读取1282个文档的成本:
- 0.039 * (1282/100000) = 5e-4美元 或 0.0005美元
2. Firestore数据包成本计算
参考Firebase官方定价,计算时忽略构建数据包的初始1282次文档读取(该操作仅需执行一次,后续用户获取数据包无需额外查询读取成本)。用户从Firebase云存储下载数据包,仅需承担带宽成本:
- 每下载1GB数据费用为0.12美元
- 包含1282个文档的数据包大小为1MB
单用户下载1MB数据包的成本:
- 0.12 * (1/1024) ≈ 1.2e-4美元 或 0.00012美元
结论
使用数据包的成本约为直接查询的24%,比直接查询低4倍:
- (1.2 / 5) * 100 = 24%
注意要点
- 本次测试使用的文档尺寸极小,无长文本内容。若文档尺寸较大,数据包的下载成本会随之增加,但查询成本保持不变,因此不建议对大文档使用数据包,否则成本反而更高。
- Firestore文档中的数字固定占用8字节,但数据包为文本文件,大数字会占用更多存储空间。
- 复杂度:需要实现Firebase云函数,按计划或集合更新时生成新数据包;集合中的变更无法同步到旧数据包,必须重新查询生成新包。
- 安全性:可通过Firestore规则锁定集合,仅允许通过云函数构建的数据包访问数据;且无需推送客户端更新即可动态调整查询内容。
- 成本优化:若使用比法兰克福(
Europe 3 (eur3),每10万次读取0.06美元)更昂贵的区域服务器,使用数据包的成本节省会更显著。- 灵活性:单个数据包可整合多个不同查询的结果,比如来自不同集合的文档;下载到客户端后,Firebase SDK会自动将文档分配到对应位置,可通过设备缓存进行查询获取。
- 混合使用方案:可通过定时云函数每24小时生成一次数据包;用户刷新时,直接从Firestore查询
last_updated属性大于数据包中最大last_updated值的文档,实现增量更新。- 理想场景:根据测试结果,大量小文档的场景下使用数据包能最大程度降低成本。
内容的提问来源于stack exchange,提问作者Khaled Sh
相关产品推荐
相关产品推荐

