Appengine Datastore,多个查询的一个索引

时间:2014-08-30 17:43:29

标签: python google-app-engine indexing google-cloud-datastore

我的代码中有多个查询使用多个属性。例如,假设一个名为user

的ndb.Model

还有一些疑问:

user.query(user.enabled == Ture, user.name == "demo").order(user.age).fetch(limit=10)
user.query(user.enabled == True, user.domain == "demo.com").fetch(limit=10)
user.query(user.enabled == False, user.phone == 2).fetch(limit=10)

我想只使用一个索引(包含所有字段)以减少大集合。 (Google限制为200)

- kind: user
  properties:
  - name: enabled
  - name: name
  - name: age
  - name: domain
  - name: phone

但是没有用。

如果不可能,有没有办法增加索引限制?

谢谢,对不起我的英语。


我不确定我是否理解。

以下是一个真实的样本。

class dbRealEstateImages(ndb.Model):
    realestate = ndb.IntegerProperty(required=True)
    md5 = ndb.StringProperty()
    image_file = ndb.BlobKeyProperty()
    image_url = ndb.StringProperty()
    position = ndb.IntegerProperty(default=0)

我想要这个查询:

dbRealEstateImages.query(dbRealEstateImages.realestate == reID).order(dbRealEstateImages.position).fetch(limit=None, projection=[dbRealEstateImages.image_url])

我们有3个属性,一个用于过滤,另一个用于排序,另一个用作投影。

因此,基于文档,我们需要一个属性和排序顺序的索引,可能是这样的:

Index(dbRealestateImage, realestate, position)
Index(dbRealestateImage, image_url, position)

但是,按升序排列,我们不需要包含在索引中,所以:

Index(dbRealestateImage, realestate)
Index(dbRealestateImage, image_url)

如果我们只有一个属性,我们不需要索引,所以我认为,"这个查询不需要索引"

但是引人注目的提升

no matching index found.
The suggested index for this query is:
- kind: dbRealEstateImages
  properties:
  - name: realestate
  - name: position
  - name: image_url

所以,我有点反对:(

P.D。:在我的配额详细信息中,所有索引都是count,autogenerated,included。

1 个答案:

答案 0 :(得分:1)

您不能只使用一个索引,为了快速,它们必须非常特定于查询。但是,对于大多数示例查询,由于zigzag merge join algorithm,自动索引可以正常工作,并且那些不会计入您的200索引限制。

排序需要自定义索引,但仅限于每个属性,例如:

Index(User, domain, -age)
Index(User, enabled, -age)
Index(User, name, -age)
Index(User, phone, -age)

这4个索引应该允许您使用按年龄排序的任何查询,无论您过滤哪些属性(如果您要为每个排列添加复合索引16)。

唯一需要注意的是,数据的形状将决定算法运行的效率;它非常聪明,但您应该阅读文档的performance部分,以便了解如何处理复杂的案例。

一如既往,你应该先衡量;当您检测到常见查询的执行速度没有您所需的那么快时,您可以为该特定情况添加复合索引。

我强烈建议您阅读Index Selection and Advanced Search文档,其中详细介绍了所有这些信息。

至于提高200限制,如果您联系支持人员,可以作为Premier客户完成(从未这样做,因此无法说明其可行性),但我强烈建议您优化索引使用第一;拥有很多它们很容易,但它也变得非常昂贵,所以花时间考虑你最好的策略是值得的(我总是发现我并不需要那么多)。