根据定价文档here https://developers.google.com/appengine/pricing, a keys-only
查询是免费的。所以看来你可以通过执行以下操作(伪代码)来保存读取:
qo = ndb.QueryOptions(keys_only = True)
qry = ModelName.query().filter("name" = "Bob")
keys = qry.fetch(20, options = qo) #keys-only fetch
然后我就可以获得我的实体,每个实体需要 1 次读取:
entities = ndb.get_multi(keys)
为什么这被认为比获取实体(即仅进行键获取)更好?
另外,查询费用从哪里来?当。。。的时候fetch
执行或当query
对象被创建?
这并不被认为是“更好”,您只是为每个查询节省 1 个额外的读取成本。这是以额外的 RPC 请求和可计费实例时间为代价的。
当您执行普通查询(即非仅键查询)时,您将返回您正在查找的对象。运行查询的 RPC 请求也将开始获取查询匹配的每个对象,因此您可以更快地获得所有结果。根据查询的结果大小,可以在单个 RPC 请求中全部获取(您可以调整batch_size
调整查询所采用的 RPC 总量)。
查询的工作方式是通过单个 RPC 请求扫描索引以查找与查询匹配的所有键,如果它是仅键查询,则它仅返回结果列表。如果是普通查询,它将开始抓取您想要的对象,并执行额外的 RPC 请求以根据需要获取所有对象。
执行查询时会产生费用,因此在您的示例中,当fetch
叫做。您只需预先构建查询及其过滤器。
不过,按照自己的方式进行操作有一个优点:始终可以假设获取的对象是一致的。也就是说,通过查询,不能保证您的结果与可能刚刚发生的任何更新“一致”。这两种方法都会受到最终一致性的影响,因为除非您执行祖先查询,否则与您的查询匹配的对象可能不会全部从索引中一致地读取,但是您的方法可以保证您使用其键获取的对象确实是最新的-最新版本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)