App Engine GQL查询属性范围

时间:2010-01-08 09:29:19

标签: google-app-engine

所以我有一个User类

class User(db.Model):
  points = db.IntegerProperty()

所以我在开发服务器上创建了1000个虚拟实体,点数范围从1到1000

query = db.GqlQuery("SELECT * FROM User WHERE points >= 300"
                     "AND points <= 700"
                     "LIMIT 20"
                     "ORDER BY points desc")

我每个查询只需要20个结果(足以填充页面)。我不需要对结果进行任何分页。

一切看起来都不错,它适用于开发服务器。

问题:
1.它是否可以在具有100,000 - 500,000个用户实体的生产服务器上运行?我会遇到很大的滞后吗?我希望不是,因为我听说App Engine会自动索引点列 2.您可以推荐的其他任何优化技术?

2 个答案:

答案 0 :(得分:1)

我认为很难说出这么多实体会遇到什么样的性能问题。这个特定的查询可能会很好,但您应该知道没有数据存储查询可以返回超过1000个实体,因此如果您需要对大于1000的数字进行操作,您将需要批量执行,并且您可以想要将它们分成不同的实体组。

就优化而言,您可能需要考虑缓存此查询的结果,并仅在您知道信息已更改或以特定间隔运行时才运行它。如果查询是出于某种目的,其中完全正确的结果并非完全关键 - 例如,显示排行榜或高分列表 - 您可能会选择每小时更新一次结果并缓存一次或类似的事情。

我能想到的唯一其他优化是,您可以通过执行一次并保存生成的对象(在memchache或全局变量中)来保存与解析该GQL语句相关联的周期。

答案 1 :(得分:1)

您的代码似乎可以获得顶级用户,但更复杂的查询,例如找出任何特定用户的排名将很难。如果您还需要此类功能,请查看google-app-engine-ranklist

  

Ranklist是Google App Engine的一个python库,用于实现   用于存储整数的数据结构   分数并快速检索他们的   相对等级。