App Engine的db.get(keys)和A.all(keys_only=True).filter('b =', b).fetch(1000)速度如何?
我用 db.get() 获取 50 个键,结果花了我 5-6 秒。这正常吗?这个时间是由什么决定的呢?
我还做了 A.all(keys_only=True).filter('b =', b).fetch(1000),其中 A.b 是一个引用属性。我进行了 50 次这样的请求,每次用不同的 b 值,总共只花了 3-4 秒。
这怎么可能呢?db.get() 是并行执行的,只需要一次请求到数据库,我本以为通过键查找一个实体会比 fetch 快。
这是我类 A 的定义:
class App(db.Model):
name_atom = db.ReferenceProperty(AppName)
author = db.ReferenceProperty(Author)
short_desc = db.StringProperty()
description = db.TextProperty()
url = db.StringProperty()
rating_avg = properties.RangeProperty(0, 1000, default=0)
rating_count = properties.RangeProperty(min_value=0, default=0)
add_dt = db.DateTimeProperty(auto_now_add=True)
modify_dt = db.DateTimeProperty(auto_now=True)
更新
好的,AppStats 显示:datastore_v3.Get real=2272ms api=416ms
我觉得问题出在我在同一个请求处理器里,紧接着做了很多效率低下的数据库调用,然后 db.get([50 keys]) 就被限制了。其他时候我做同样的 db.get(),只花了 200ms :)
2 个回答
当你通过键来获取数据时,查询的时间主要取决于你的数据有多大。因为这些数据需要通过网络传输到你这里,然后再进行解码。
也许你的数据比较大?这可能就是为什么你的 keys_only
查询速度更快的原因,尽管它包含了过滤条件并且获取了更多的结果。
你可以考虑使用 AppStats,这样你就能清楚地看到为什么你的请求花了这么长时间。你甚至可以把这个信息和你的问题一起发布出来。
我用 db.get() 获取 50 个键,似乎要花 5-6 秒。这正常吗?这个时间是由什么决定的呢?
不,这个时间应该只需要几百毫秒。不过,你是怎么测量这个时间的呢?
我还做了一个 A.all(keys_only=True).filter('b =', b).fetch(1000) 的操作,其中 A.b 是一个引用属性。我进行了 50 次这样的数据存取,每次用不同的 b 值,结果总共只花了 3-4 秒。
对于 50 次数据存取来说,这个时间并不算过分。
这怎么可能呢?db.get() 是并行执行的,只需要一次去数据存储的操作,我觉得通过键查找一个实体应该比 fetch 操作快。
这个结果确实很奇怪,我觉得可能有其他因素在影响。正如 David 所说,你应该使用 AppStats 来找出时间花在哪里了。