【问题标题】:Google App Engine query optimizationGoogle App Engine 查询优化
【发布时间】:2012-02-24 21:37:54
【问题描述】:

我有一个 Google App Engine 数据存储区,其中可能包含数百万条记录,我正在尝试找出最好的查询方式,我需要在其中获取与多个字符串匹配的记录。

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

字符串名称 字符串级别 智力分数

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

它基本上是给定级别(“级别”)的玩家(“名称”)的高分(“分数”)列表。我想按“名称”为玩家列表查找给定“级别”的所有分数,以构建仅包括您的朋友的高分列表。

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

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

“级别”需要是字符串,而不是 Int,因为它们不是编号级别而是级别名称,但我不知道这是否重要。

【问题讨论】:

    标签: google-app-engine


    【解决方案1】:

    您可以使用IN filter operator 将属性与值列表(用户名)进行匹配:

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

    请注意,这在后台执行的查询数量与 user_list 中的用户数量一样多。

    【讨论】:

      【解决方案2】:
      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
      

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

      【讨论】:

      • 我担心的是 Player.all().filter(...) 查询可能会返回数十万条记录,这可能会给 python 带来压力,然后再通过它们进行转换。显然是由某人完成的工作,但数据库引擎可能会更好地优化来做到这一点(就像 mysql 通常是而不是 php)。我只是没有看到将这项工作卸载到 GAE 数据库的方法,并且可能没有给出它是如何工作的。
      【解决方案3】:

      不,你不能一次完成。

      您将不得不逐个查询朋友的级别

      为每个级别创建一个朋友评分实体。每次分数变化时,检查他所属的朋友列表并更新他们的所有列表。那么它只是一个问题或检索该列表。

      除非优化,否则第一个会很慢,第二个会很昂贵。

      【讨论】:

      • 您的第二个选项是一个有趣的想法。我可能会看到那个样子。谢谢。
      • 这是不正确的。您可以使用IN 过滤器运算符对值列表执行查询。
      • 是的,我忘记了 IN 运算符,你可以使用它。只要确保如果您有超过 30 个朋友,您需要进行两次查询,因为子查询限制为 30 个。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-11
      • 1970-01-01
      相关资源
      最近更新 更多