数据存储区中确实需要索引吗?

时间:2011-01-19 06:52:59

标签: google-app-engine google-cloud-datastore

我对一些GAE文档感到有些困惑。虽然我打算添加索引以优化我的应用程序的性能,但我想澄清它们是否仅为此目的而建议,或者是否真的需要它们。

  

查询无法找到属性值   那些没有索引的。这包括   标记为不的属性   索引,以及属性   长文本值类型的值   (文本)或长二进制值类型   (BLOB)。

     

带有过滤器或排序顺序的查询   财产永远不会与实体相匹配   其属性值为Text   或Blob,或写的   标记为未编入索引的属性。   具有此类值的属性表现为   如果没有关注财产   查询过滤器和排序顺序。

来自http://code.google.com/appengine/docs/java/datastore/queries.html#Introduction_to_Indexes

第一段让我相信你根本无法对未编入索引的属性进行排序或过滤。但是,第二段让我认为此限制仅限于Text或Blob属性或专门注释为未编入索引的属性。

我对这种区别感到好奇,因为我有一些数字和字符串字段,我目前正在生产环境中进行排序/过滤,这些字段是无索引的。这些查询正在后台任务中运行,后者通常不关心性能(宁愿在此引用中优化大小/成本)。我是不是很幸运,这些正在返回正确的数据?

4 个答案:

答案 0 :(得分:6)

在GAE数据存储区中,将自动为所有不可索引的属性(显式标记或属于这些类型的属性)创建单个属性索引。

我认为该文档中的语言有点令人困惑。

当您想要通过多个属性进行索引时(例如,按两个不同的属性进行排序),您只需要显式定义索引。

答案 1 :(得分:4)

在GAE中,不幸的是,如果该属性被标记为未编制索引

  num = db.IntegerProperty(required=True, indexed=False)

然后就不可能将它包含在自定义索引中......这会适得其反(我的代码从不使用大多数内置索引,但需要占用大量空间)。但这是GAE目前的工作方式。

  

Datastore Indexes - Unindexed properties

     

注意:如果属性出现在由多个属性组成的索引中,则将其设置为unindexed将阻止它在组合索引中编入索引。

答案 2 :(得分:1)

在没有明确输入indexed = True或indexed = False的情况下,切勿向模型添加属性。在执行put()时,索引需要大量资源:空间,写入操作成本和延迟增加。我们永远不会,即使index = False,也不会在没有明确声明其索引值的情况下添加属性。节省昂贵的疏忽,并迫使人们总是考虑是否要编制索引。 (你会在某个时候发现自己诅咒你忘记覆盖默认值= True的事实。)GAE工程师会通过不允许默认为True imho来提供优质服务。如果我是他们,我根本就不会提供默认值。 HTH。 -stevep

答案 3 :(得分:0)

如果要在一个查询中使用两个或更多过滤器功能,则必须使用索引 e.g:
Foobar.filter('foo =',foo).filter('bar =',bar)

如果你只是用一个过滤器查询,则不需要使用索引,这是自动生成的。

对于Blob和Text,你不能为它们生成索引,即使你在index.yaml中指定它,同时你也不能在它们中使用过滤器。
例如
foob​​ar(db.Model):
  content = db.TextProperty()
Foobar.filter('content =',content)
上面的代码会引发错误,因为无法为TextProperty分配索引且无法匹配。