2010-01-08 54 views
0

所以我有一个用户类App Engine的GQL查询财产范围

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.您可以推荐的任何其他优化技术?

回答

1

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

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

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

+1

缓存GQL对象没有任何意义 - 解析比酸洗/取消更便宜!但是使用Query接口比GQL稍快。 – 2010-01-11 11:30:40

+0

我不是故意说GQL对象需要被腌制。相反,通过持有它的一个实例,你可以避免在每次请求时都要重新解析它,但如果尼克约翰逊说你不需要打扰,那肯定不会。 – 2010-01-11 14:03:51

1

您的代码似乎很适合获得顶级用户,但更复杂的查询,比如查明任何特定用户的排名会很难。如果您也需要这种功能,请查看google-app-engine-ranklist

Ranklist是谷歌App Engine的一个Python库,用于实现存储整数 成绩和快速检索自己的 相对行列 数据结构。