在GAE的大桌上,指数会以什么速度"爆炸"?

Chr*_*row 5 indexing google-app-engine bigtable

在GAE的大桌上,指数会以什么速度"爆炸"?

下面的文档摘录说明,对于集合值,索引可能会以指数方式"爆炸".

这是否意味着对于具有两个集合值的对象,第一个集合中的每个值子集都有一个索引条目,与第二个集合中的每个子集配对?或者每个可能的值对只有一个索引条目?

例:

实体:

widget:{
     mamas_list:         ['cookies', 'puppies']
     papas_list:         ['rain', 'sun']
    }
Run Code Online (Sandbox Code Playgroud)

第一个集合中每个值子集的索引条目与第二个集合中的每个子集配对:

cookies         rain
cookies puppies rain
cookies puppies rain sun
cookies         sun
cookies         rain sun
puppies         rain
puppies         sun
puppies         rain sun
Run Code Online (Sandbox Code Playgroud)

每个可能的值对只有一个索引条目:

cookies         rain
cookies         sun
puppies         rain
puppies         sun
Run Code Online (Sandbox Code Playgroud)

爆炸索引摘录:

资料来源:https://developers.google.com/appengine/docs/python/datastore/indexes#Index_Limits

对于同一属性可以具有多个值的实体需要为每个值指定单独的索引条目; 同样,如果可能值的数量很大,则这样的实体可以超过进入限制.

在具有多个属性的实体的情况下情况变得更糟,每个属性可以采用多个值.为了适应这样的实体,索引必须包含每个可能的属性值组合的条目.引用多个属性的自定义索引(每个属性具有多个值)可以组合"爆炸", 对于仅具有相对较少数量的可能属性值的实体需要大量条目.(取自: )

Fel*_*ffa 2

克里斯,

仅当您为多个重复属性显式添加 index.yaml 条目,并且保存到表的对象具有太多多个属性时,才会出现“爆炸索引问题”。

在示例中,您的index.yaml是否添加了该索引?

- kind: widget
  properties:
  - name: mamas_list
  - name: papas_list
Run Code Online (Sandbox Code Playgroud)

如果将示例对象保存到数据存储区:

widget(mamas_list=['a', 'b'], papas_list['c', 'd']).put()
Run Code Online (Sandbox Code Playgroud)

将保存 4 个不同的索引:

['a', 'c'] ['a', 'd'] ['b', 'c'] ['b', 'd']
Run Code Online (Sandbox Code Playgroud)

添加此索引的全部目的是允许通过这两个属性进行查询:

widget.query().filter(mamas_list=='a').filter(papas_list=='d').fetch()
Run Code Online (Sandbox Code Playgroud)

使用 zig-zag 算法索引,您始终可以避免爆炸索引(在此示例案例中未找到):

http://www.google.com/events/io/2010/sessions/next-gen-queries-appengine.html