我正在尝试尽可能高效地为 GAE 进行读写操作,我想知道以下两个选项中哪个是最好的。
我有一个网站,用户可以在其中发布不同的内容,现在每当我想显示该用户的所有帖子时,我都会使用该用户的用户 ID 查询所有帖子,然后显示它们。将所有帖子 ID 存储在用户实体中并执行 get_by_id(post_ID_list) 以返回所有帖子会更好吗?或者,被用完的额外空间不值得吗?
在任何地方我都可以找到更多这样的信息来优化我的网络应用程序吗?
谢谢!
我正在尝试尽可能高效地为 GAE 进行读写操作,我想知道以下两个选项中哪个是最好的。
我有一个网站,用户可以在其中发布不同的内容,现在每当我想显示该用户的所有帖子时,我都会使用该用户的用户 ID 查询所有帖子,然后显示它们。将所有帖子 ID 存储在用户实体中并执行 get_by_id(post_ID_list) 以返回所有帖子会更好吗?或者,被用完的额外空间不值得吗?
在任何地方我都可以找到更多这样的信息来优化我的网络应用程序吗?
谢谢!
您想要存储 ID 列表的主要原因是,您可以分别获取每个实体以获得更好的一致性 - 通过 id 获取的实体与数据存储区中的最新版本一致,而查询最终是一致的。
检查数据存储成本并优化成本: https ://developers.google.com/appengine/docs/billing
通过密钥获取实体不会比查询所有帖子便宜。该查询使用索引。
如果您使用投影查询,则可以大大降低成本。
有几种情况。
首先,如果您跟踪用户帖子的所有 ID。您必须使用实体组以保持一致性。这意味着写入数据存储的速度约为每秒 1 个实体。对于具有 id 的对象,成本是 1 次读取,每个实体读取 1 次。
其次,如果您只使用查询。这不需要一致性。成本为每检索到的实体 1 次读取 + 1 次读取。
第三,如果您只查询键并且在获取之后。成本为 1 次读取 + 1 个小检索到的每个密钥。观看此:仅键查询。这相当于投影查询成本。
如果你有很多结果,并且使用分页,那么你需要使用Query Cursors。这可以防止数据存储的无用使用。
最经济的解决方案是第三种情况。观看:批量操作。
如果您有一个 id 列表,因为它们与您的实体一起存储,调用 ndb.get_multi (如果您使用 NDB,但它与使用 memcache 缓存单个实体的任何其他框架类似)将节省您如果与键对应的所有(或大多数)实体已经在数据存储中,则进一步调用数据存储。
所以在最好的情况下(一切都在内存缓存中),数据存储区根本不会被触及,而使用查询会。
有关讨论和注意事项,请参阅此问题:http ://code.google.com/p/appengine-ndb-experiment/issues/detail?id=118 。