2011-01-19 62 views
4

我对GAE的一些文档有些困惑。虽然我打算增加索引来优化我的应用程序的性能,但我想澄清一下,如果它们只是为此目的而建议的,或者它们是真正需要的。数据存储中真的需要索引吗?

查询找不到索引的属性值 。这包括标记为 索引的 属性以及长文本值类型 (Text)或长二进制值类型 (Blob)的 值的属性。

带有过滤器的查询或 排序顺序属性永远比不上实体 的属性,其值是一个文本 或斑点,或写有 该属性标记为未编入索引。 如果未针对 设置属性来查询过滤器和排序顺序,则具有此类值的属性的行为为 。

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

第一款让我相信,你根本无法排序或没有索引的属性过滤器。但是,第二段使我认为这个限制仅限于Text或Blob属性或特别注明为未索引的属性。

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

回答

6

在GAE数据存储中,将为所有非索引(明确标记或属于这些类型)属性自动创建单个属性索引。

我认为该文档中的语言有点混乱。

当你想指数由多于一个物业,您只需要明确定义索引(比如,由两个不同的属性进行排序。)

+0

非常感谢,清除了很多混乱。这个自动索引是否默认为升序或降序? – netmau5 2011-01-19 07:08:05

+2

@ netmau5自动索引适用于两个方向。您想要查询的所有内容都必须编入索引。 – 2011-01-20 01:02:33

0

,如果你想使用两个或更多的过滤功能,你必须使用索引在一个单一的查询中。
e.g:
Foobar.filter( '富=',FOO).filter( '吧=',吧)

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

对于Blob和Text,您无法为它们生成索引,即使您在index.yaml中指定它,同时您也无法在其中使用过滤器。
例如
类Foobar的(db.Model):
含量= db.TextProperty()
Foobar.filter( '含量=',内容)以上
码将产生一个错误,因为TextProperty不能分配一个索引和无法匹配。

+0

重新“两个或更多过滤器函数[s]”,这不太正确。数据存储区使用内置索引自动支持多种类型的查询,而无需自定义索引。请参阅[本页](http://code.google.com/appengine/docs/python/datastore/queries.html#Introduction_to_Indexes)上App Engine为...提供自动索引的部分。 – ryan 2011-01-26 22:16:50

4

在GAE,不幸的是,如果属性标记为未索引

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

那么就不可能将其包含在自定义索引...这是适得其反(内置大多数指数从来没有使用过我的代码,但占用大量空间)。但现在GAE是如何工作的。

Datastore Indexes - Unindexed properties

注意:如果一个属性出现在多个属性构成的索引,然后将其设置为未加索引会阻止它在构成的索引进行编号。

0

不要在没有EXPLICITLY输入indexed = True或indexed = False的情况下将属性添加到模型。指数占用大量资源:空间,写操作成本,以及执行put()时的延迟增加。我们永远不会添加属性,即使索引= False也不明确地声明它的索引值。节省昂贵的疏忽,并迫使人们总是考虑是否索引。 (你会在某个时候发现自己诅咒你忘记覆盖默认值= True的事实。)GAE Engineers会做出很好的服务,不允许默认为True imho。如果我是他们,我不会提供默认的。 HTH。 -stevep

相关问题