【问题标题】:Multiple queries vs. manually sorting one large query (AppEngine NDB)多个查询与手动排序一个大查询(AppEngine NDB)
【发布时间】:2012-10-01 17:37:38
【问题描述】:

对于这样的模型:

class Thing(ndb.Model):
    visible = ndb.BooleanProperty()
    made_by = ndb.KeyProperty(kind=User)
    belongs_to = ndb.KeyProperty(kind=AnotherThing)

基本上执行“或”查询,但比较不同的属性,所以我不能使用内置的 OR...我想获取所有 Thing(属于特定的 AnotherThing),它们要么有 @987654324 @ 设置为 TruevisibleFalsemade_by 是当前用户。

这对数据存储的要求较低(即财务成本较低):

  1. 查询以获取所有内容,即:Thing.query(Thing.belongs_to == some_thing.key) 并遍历结果,存储可见的以及不可见但由当前用户制作的结果?

  2. 查询获取可见的,即:Thing.query(Thing.belongs_to == some_thing.key, Thing.visible == "True"),单独查询获取当前用户不可见的,即:Thing.query(Thing.belongs_to == some_thing.key, Thing.visible == "False", Thing.made_by = current_user)?

数字 1. 会得到许多不需要的结果,例如其他用户不可见的Things - 我认为这是对数据存储的多次读取? 2. 是两个完整的查询,这也可能是不必要的繁重,对吧?我仍在尝试找出与数据库的何种交互会导致何种成本。

我在必要时使用 ndb、tasklet 和 memcache,以防万一。

【问题讨论】:

  • 为什么说不能用OR?

标签: python google-app-engine app-engine-ndb


【解决方案1】:

出于两个原因,排名第二的财务将减少。首先,您为每次读取数据存储和查询中返回的每个实体付费,因此您将为第一个读取所有数据和查询所有数据的实体支付更多费用。第二种方式,您只需按需要付费。

其次,您还需要为后端或前端时间付费,并且您将在第一种方法中使用时间来迭代所有结果,而第二种方法则无需花费时间。

我看不出第一个选项更好的方法。 (也许你只有几个实体??)

要了解读取和查询的成本,请向下滚动一点: https://developers.google.com/appengine/docs/billing

您将看到如何为读取、写入和查询添加 Read、Writes 和 Smalls。

我也将只查询当前用户拥有的那些,而不是可见=false 和所有者=当前,这样您就不需要复合索引,这会节省一些时间。您还可以使部分索引可见,这也节省了一些空间(仅在为 true 时对其进行索引,假设您永远不需要查询 false 索引)。您需要做一些工作来删除重复项,但这可能还不错。

【讨论】:

    【解决方案2】:

    您可能最好使用真实数据对这两种情况进行基准测试。很难在抽象中确定这样的事情,因为有许多细微之处可能会影响整体性能。

    我希望选项 2 会更好。加载大量您不关心的对象只会给数据存储带来沉重的负担,我认为额外的查询无法与之相比。当然,这取决于有多少额外的东西等等。

    【讨论】:

      猜你喜欢
      • 2013-06-16
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      • 2014-12-13
      • 2019-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多