谷歌应用程序引擎查询优化

时间:2012-09-22 18:28:59

标签: google-app-engine google-cloud-datastore query-optimization

我正在尝试尽可能高效地为GAE进行读写操作,并且我想知道哪个是以下两个选项中最好的。

我有一个网站,用户可以发布不同的内容,现在每当我想要显示该用户的所有帖子时,我会查询具有该用户的用户ID的所有帖子,然后显示它们。将所有帖子ID存储在用户实体中并执行get_by_id(post_ID_list)以返回所有帖子会更好吗?或者那些额外的空间用完了不值得吗?

我可以在任何地方找到更多这样的信息来优化我的网络应用吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

您希望存储ID列表的主要原因是,您可以单独获取每个实体以获得更好的一致性 - 实体获取ID与数据存储区中的最新版本一致,而查询最终是一致的。 / p>

检查数据存储成本并优化成本: https://developers.google.com/appengine/docs/billing

按密钥获取实体并不比查询所有帖子便宜。该查询使用索引。

如果您使用投影查询,则可以相当多地降低成本。

答案 1 :(得分:0)

有几种情况。

首先,如果您跟踪用户帖子的所有ID。您必须使用实体组以保持一致性。这意味着写入数据存储的速度将是每秒约1个实体。对于带有id的对象和每个实体1次读取,成本为1。

其次,如果您只是使用查询。这不需要一致性。每个检索到的实体的成本是1读+ 1读。

第三,如果你只提取钥匙和取货后。检索到的每个密钥的成本为1读取+ 1个小。请注意:Keys-Only Queries。这等于投影查询成本。

如果你有很多结果,并使用分页,那么你需要使用Query Cursors。这可以防止无用的数据存储。

最经济的解决方案是第三种情况。请注意:Batch Operations

答案 2 :(得分:0)

如果您有一个id列表,因为它们与您的实体一起存储,则调用ndb.get_multi(如果您使用的是NDB,但它与使用memcache缓存单个实体的任何其他框架类似)如果与密钥相关的所有(或大多数)实体已经存在于数据存储区中,则会为您节省更多数据存储区调用。

因此,在最好的情况下(一切都在memcache中),数据存储区根本不会被触及,而使用查询则会。

有关讨论和警告,请参阅此问题:http://code.google.com/p/appengine-ndb-experiment/issues/detail?id=118