5

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

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

在具有多个属性的实体的情况下,情况会变得更糟,每个属性都可以取多个值。为了容纳这样的实体,索引必须包含每个可能的属性值组合的条目。引用多个属性(每个属性具有多个值)的自定义索引可以组合地“爆炸”, 对于只有相对少量可能的属性值的实体需要大量条目。(取自: )

4

1 回答 1

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

于 2013-05-11T06:36:44.723 回答