0

在启用 Appstats 并分析我的应用程序后,我惊慌失措地试图弄清楚如何通过任何方式降低成本。我每个请求的大部分成本都来自查询,因此我试图尽可能地消除查询。

例如,我有一个查询,我想在某个日期 X 之后获取用户的 StatusUpdates。我使用查询来获取:statusUpdates = StatusUpdates.query(StatusUpdates.date > X)

所以我认为我可能会智取系统并避免查询,但为了降低读取成本而产生更高的写入成本。我认为每次用户写入状态时,我都会将该状态的密钥存储在用户的列表属性中。因此,我不会查询,而是会做ndb.get_multi(user.list_of_status_keys).

问题是,这两种方法之间的系统有什么区别?当然,我避免对第二种情况进行查询,但是这里的幕后发生了什么?我在第二种情况下正在做什么,我正在收集密钥,只是我做一个手动索引,GAE 会为我做查询?

一般来说,get_multi(keys) 和查询有什么区别?哪个更有效率?哪个成本更低?

4

2 回答 2

2

检查计费文档:

https://developers.google.com/appengine/docs/billing

这很简单。读取是 $0.07/100k,smalls 是 $0.01/100k,所以你想做smalls。

一个查询是 1 次读取 + 1 次小型 / 实体 A 是 1 次读取。如果您通过查询返回超过 1 个实体,则执行查询比从键中读取实体更便宜。

查询也可能更有效。执行获取的唯一好处是它们将完全一致(而查询最终是一致的)。

于 2012-09-19T02:44:05.257 回答
1

存储密钥不会查询,因为您无法仅使用密钥执行任何操作。您仍然需要从内存中获取状态对象。此外,由于您想查询 Status 对象的日期,因此您需要将所有Status 对象提取到内存中并自己比较它们的日期。如果您使用查询,appengine 将仅获取具有所需日期的状态。由于您获取的内容更少,因此您的阅读成本会更低。

由于这与您在此处提出的问题基本相同,因此我建议您查看我在此处给出的答案。

于 2012-09-18T22:57:32.953 回答