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

时间:2013-05-09 21:08:27

标签: google-app-engine indexing bigtable

GAE的大表中指数“爆炸”的速度是多少?

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

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

实施例

实体:

widget:{
     mamas_list:         ['cookies', 'puppies']
     papas_list:         ['rain', 'sun']
    }

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

cookies         rain
cookies puppies rain
cookies puppies rain sun
cookies         sun
cookies         rain sun
puppies         rain
puppies         sun
puppies         rain sun

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

cookies         rain
cookies         sun
puppies         rain
puppies         sun

爆炸索引摘录:

  

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

     

可以为同一属性提供多个值的实体   每个值的单独索引条目;再次,如果数量   可能的值很大,这样的实体可以超过进入限制。

     

在具有多个实体的情况下情况变得更糟   属性,每个属性可以采用多个值。以适应   这样的实体,索引必须包含每个可能的条目   财产价值的组合。 引用多个的自定义索引   每个属性都有多个值,可以组合“爆炸”,   需要大量条目的实体只有一个   相对较少的可能属性值。   (摘自:)

1 个答案:

答案 0 :(得分:2)

克里斯,

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

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

- kind: widget
  properties:
  - name: mamas_list
  - name: papas_list

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

widget(mamas_list=['a', 'b'], papas_list['c', 'd']).put()

将保存4个不同的索引:

['a', 'c'] ['a', 'd'] ['b', 'c'] ['b', 'd']

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

widget.query().filter(mamas_list=='a').filter(papas_list=='d').fetch()

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

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