我对一些GAE文档感到有些困惑。虽然我打算添加索引以优化我的应用程序的性能,但我想澄清它们是否仅为此目的而建议,或者是否真的需要它们。
查询无法找到属性值 那些没有索引的。这包括 标记为不的属性 索引,以及属性 长文本值类型的值 (文本)或长二进制值类型 (BLOB)。
带有过滤器或排序顺序的查询 财产永远不会与实体相匹配 其属性值为Text 或Blob,或写的 标记为未编入索引的属性。 具有此类值的属性表现为 如果没有关注财产 查询过滤器和排序顺序。
来自http://code.google.com/appengine/docs/java/datastore/queries.html#Introduction_to_Indexes
第一段让我相信你根本无法对未编入索引的属性进行排序或过滤。但是,第二段让我认为此限制仅限于Text或Blob属性或专门注释为未编入索引的属性。
我对这种区别感到好奇,因为我有一些数字和字符串字段,我目前正在生产环境中进行排序/过滤,这些字段是无索引的。这些查询正在后台任务中运行,后者通常不关心性能(宁愿在此引用中优化大小/成本)。我是不是很幸运,这些正在返回正确的数据?
答案 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中指定它,同时你也不能在它们中使用过滤器。
例如
foobar(db.Model):
content = db.TextProperty()
Foobar.filter('content =',content)
上面的代码会引发错误,因为无法为TextProperty分配索引且无法匹配。