App Engine的db.get(keys)和A.all(keys_only=True).filter('b =', b).fetch(1000)速度如何?

3 投票
2 回答
1595 浏览
提问于 2025-04-16 00:07

我用 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 个回答

2

当你通过键来获取数据时,查询的时间主要取决于你的数据有多大。因为这些数据需要通过网络传输到你这里,然后再进行解码。

也许你的数据比较大?这可能就是为什么你的 keys_only 查询速度更快的原因,尽管它包含了过滤条件并且获取了更多的结果。

你可以考虑使用 AppStats,这样你就能清楚地看到为什么你的请求花了这么长时间。你甚至可以把这个信息和你的问题一起发布出来。

3

我用 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 来找出时间花在哪里了。

撰写回答