2012-02-24 117 views
0

我有一个Google App Engine数据存储,其中可能有数百万条记录,我试图找出最好的方法来做一个查询,我需要获取匹配多个字符串的记录。谷歌App Engine查询优化

例如,假设我有以下型号:

字符串名称 串级 诠释得分

我需要返回所有的记录,对于给定的“水平”也匹配“列表名字”。名称列表中可能只有1或2个名称,但可能有100个。

它基本上是给定级别(“级别”)的玩家(“名称”)的高分(“分数” )。我想通过“名称”找到给定“级别”玩家列表的所有分数,以建立一个包含您的朋友的高分列表。

我可以遍历“名称”列表并针对该级别的每个高分执行查询,但我不知道这是否是最好的方法。在SQL中,我可以构造一个(复杂)查询来执行此操作。

考虑到数据存储的大小,我想确保我不会浪费时间运行应该由查询完成的python代码,反之亦然。

“级别”需要是一个字符串,而不是一个INT,因为他们没有编号levesl,而是级别名称,但我不知道这是否重要。

回答

0

您可以使用IN filter operator反对值的列表匹配属性(用户名):

scores = Scores.all().filter('level ==', level).filter('user IN', user_list) 

注意,引擎盖下的人数是user_list用户这个执行尽可能多的查询。

0
players = Player.all().filter('level =', level).order('score') 

names = [name1, name2, name3, ...] 

players = [p for p in players if p.name in names] 

for player in players: 
    print name, print score 

这是你想要的吗?
...还是我简化太多了?

+0

我担心的是,Player.all()。滤波器(...)查询可能对蟒蛇返回几十万条记录,并可能是一个应变,然后通过他们转移。很明显,工作是由某人完成的,但数据库引擎可能会更好地进行优化(像mysql通常不是php)。我只是没有看到将这项工作转移到GAE数据库的方法,可能没有给出它的工作原理。 – 2012-02-25 05:18:59

0

不,你不能一次完成。

你将有一个

做出的朋友得分实体,每个级别的任何查询朋友的一个水平。每次分数变化时,检查他所属的朋友列表并更新其所有列表。那么它只是一个问题或检索该列表。

第一个将是缓慢的,第二个昂贵的,除非优化。

+0

你的第二个选择是一个有趣的想法。我可能会看到那个样子。谢谢。 – 2012-02-25 17:12:05

+0

这是不正确的。您可以使用'IN'过滤器运算符对值列表执行查询。 – 2012-02-25 19:49:20

+0

是的,我忘记了IN运算符,您可以使用它。只要确保,如果你有超过30位朋友,你需要做两个查询的子查询被限制为30。 – Mahron 2012-02-26 04:33:19