GAE 大表中的索引以啥速度“爆炸”?

Posted

技术标签:

【中文标题】GAE 大表中的索引以啥速度“爆炸”?【英文标题】:At what rate do indexes "explode" in GAE's big table?GAE 大表中的索引以什么速度“爆炸”? 【发布时间】:2013-05-09 21:08:27 【问题描述】:

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】:

克里斯,

只有在您为多个重复属性显式添加 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

【讨论】:

以上是关于GAE 大表中的索引以啥速度“爆炸”?的主要内容,如果未能解决你的问题,请参考以下文章

大表的mysql性能问题

MySQL大表清空和删除正确方法

在 Django 中的大表上的内存效率(常量)和速度优化迭代

MySQL高性能优化规范建议,速度收藏

MySQL8 大表清空和删除正确方法

mysql中的索引