Datastore中NDB查询命中实体与get()操作的定价计数规则是否相同?
NDB查询与按键get()的Datastore读取成本对比结论
两种操作的读取成本完全不一致,通过查询查找实体的方式成本绝不会更低,绝大多数场景下反而比直接按键get()更高。
具体计费规则差异
- 按键直接执行
get():属于Datastore标准单实体读取操作,每成功获取1个实体仅收取1次单实体读取单位的费用。如果命中NDB自带的上下文缓存、配套memcache缓存,不会产生Datastore服务端的读取计费。 - NDB普通查询(返回完整实体):计费拆分为两个独立部分,总开销是两部分之和:
- 索引检索阶段:每扫描1条索引条目,收取1次小读取费用,小读取的单位成本约为单实体读取的1/10。这部分开销和最终返回的实体数量无关,只和查询实际扫描的索引条目数挂钩,哪怕查询最终返回0个结果,只要扫描了索引就会计费。
- 实体拉取阶段:查询结果中每返回1个完整实体,和直接
get()一样收取1次单实体读取费用。
举个常见场景的成本计算示例:你要查询
User类型下email = "test@example.com"的单个实体,因为没有对应实体的key,只能走查询。该查询在索引层共扫描了15条索引条目才定位到目标实体,最终返回1个完整实体。该操作的总开销为15次小读取 + 1次单实体读取,折算后约等于2.5次单实体读取的成本,远高于直接拿key执行get()的1次单实体读取成本。
特殊场景说明
如果使用keys-only查询(仅获取实体key、不返回实体内容),只会产生索引扫描阶段的小读取费用,不会产生实体拉取阶段的单实体读取费用。但如果拿到key后还需要获取实体完整内容,仍需额外执行get()操作,总开销依然高于直接持有key时调用get()的成本。
另外要注意:如果查询没有配置匹配的索引,导致索引层大范围扫描,产生的小读取开销会远高于预期,极端场景下甚至可能出现“查1个实体花了上百次读取成本”的情况。
内容的提问来源于stack exchange,提问作者user1961
相关产品推荐
相关产品推荐

