我的代码中有多个查询使用多个属性。例如,假设一个名为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。
答案 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客户完成(从未这样做,因此无法说明其可行性),但我强烈建议您优化索引使用第一;拥有很多它们很容易,但它也变得非常昂贵,所以花时间考虑你最好的策略是值得的(我总是发现我并不需要那么多)。