Google-app-engine NDB iter keys_only

时间:2012-04-01 14:37:36

标签: python google-app-engine app-engine-ndb

假设我有一个经常执行的查询,很可能产生相同的结果。

使用:

是否正确
for key in qry.iter(keys_only=True):
    item = key.get()
    #do something with item

表现优于:

for item in qry:
    #do something with item

因为在第一个示例中,查询只会加载密钥,后续调用key.get()将利用NDB的缓存机制,而示例2将始终从商店中获取实体?或者我误解了什么?

2 个答案:

答案 0 :(得分:7)

我怀疑第二种形式会表现得更好 - 高速缓存中的值总是可能,然后,假设你回来了多个实体,那么' d进行多次往返。这很快就会变慢。

更好的方法确实是http://code.google.com/p/appengine-ndb-experiment/issues/detail?id=118中显示的 - 使用ndb.multi_get(q.fetch(keys_only = True))。但如果你的缓存命中率太低,那就更糟了;在这个问题上对此进行了广泛的讨论。

答案 1 :(得分:1)

AFAIK它不会有任何不同,因为在内部,ndb会缓存所有内容,包括查询。如果你要为每个人做其他事情,请尝试async api。这可以节省宝贵的时间。编辑:此外,如果ndb提前知道查询,它甚至可以预取它们。

我已经读过六个月了,所以不确定当前的行为是什么。