我在理解索引如何在GAE数据存储区中工作时遇到了一些问题,特别是我真正不清楚的是与索引相关的限制。
据我了解,可以在datastore-indexes.xml文件中创建一些自定义索引,此外,数据存储区还将生成一些自动索引以匹配用户查询。
第一个问题是:在配额页面(https://cloud.google.com/appengine/docs/quotas#Datastore)中定义的“索引数”配额限制仅引用到datastore-indexes中定义的自定义索引。 xml,还是也适用于自动生成的索引?
让我难忘的另一个概念是“单个查询的索引条目”。
假设我没有多维属性(即没有列表),并且我有一些类型为“ KindA”的实体。然后定义两组实体属性:
-组1:具有arbitray名称和布尔值的
属性-组2:具有arbitray名称和double值的属性
在我的世界中,任何KindA实体最多可以具有Group1的N个属性和Group2的N个属性。对于任何属性P,都会创建一个索引表,并且具有该P集的每个实体都将在P索引表中添加一行(对吗?)。因此,最初,任何KindA实体对于每个最大值都有1个条目。2N个属性(因此每个实体总共2N个索引条目总数)对吗?
如果这是正确的话,那么我可以创建一个属性数量有限的实体,但是这很奇怪,因为我一直都读到一个实体可以具有无限的属性...(不考虑大小限制)。
但是,现在让我们假设我的应用程序允许用户使用Group1(布尔值1)的属性上任意长的AND过滤器序列来查询KindA实体。因此,人们可以查询以下内容:
find all entities in KindA where prop1=true AND prop2=true ... AND propM = true
在这种情况下,查询仅包含等式,因此不需要自定义索引(https://cloud.google.com/appengine/docs/python/datastore/indexes#Index_configuration)。
但是,如果我想使用GroupB的属性进行订购怎么办?在这种情况下,我需要任何不同查询权限的索引(根据过滤属性名称的组合而不同)?
在我的developermnet服务器中,我尝试不指定任何自定义索引,而GAE会为我生成它们(但是,任何时候我重新启动以前生成的索引都会被删除)。在这种情况下,一个信号KindA实体在单个查询索引中有多少个索引条目?我之所以说1是因为GAE文档所说:
该属性也可能包含在索引配置文件(index.yaml)中声明的其他自定义索引中。如果一个实体没有列表属性,则在每个这样的自定义索引中(对于非祖先索引)最多具有一个条目,或者对于每个实体的祖先(对于祖先索引)都具有一个条目。
因此,从理论上讲,如果N受限制,那么对于“实体的索引条目的最大数量”(https://cloud.google.com/appengine/docs/java/datastore/#Java_Quotas_and_limits)来说,我是安全的?
但是,接收200多个不同的查询呢?会导致GAE自动生成200多个自定义索引(一个用于不同的查询)?如果是,这些索引是否会自动产生影响索引数限制(即200)?
如果是,则说明我不能让用户执行此查询(恕我直言,这是非常基本的)。我误会了吗?
首先,我试图理解您的问题,但我很难理解。
200索引限制仅计入使用查询定义的索引(或由devappserver自动为您定义)。这意味着将单独为索引属性创建的索引不计入此限制。
您为每个索引属性创建的2N个自动索引都是正确的。
只要您不超过每个实体1MB的限制,就可以在任何实体中建立任何数量的索引属性。但是..这实际上取决于存储的属性的内容。
对于在索引属性中为您创建的索引……您并没有真正的限制,而是增加了成本,因为您为每个添加的属性增加的每个实体放置的写入和存储量都会增加。
使用排序顺序时,使用自动索引时只能使用一种排序顺序。更多的排序顺序将需要一个复合索引(您的自定义索引)。因此,如果您已经在使用相等过滤器,则无论如何都需要一个自定义索引。
因此,是的,在您的示例中,devapp服务器将为您将要执行的每个查询创建一个复合索引。但是,您可以通过删除不需要的索引来手动减少此索引。查询计划者可以使用查询时间通过合并不同的索引来找到您的结果,如下所示:
https://cloud.google.com/appengine/articles/indexselection
是的,index.yaml上的每个索引定义都将计入200个限制。
我发现,当您知道如何对gae应用进行编程时,您实际上并不会使用过多的复合索引。您需要权衡用户需要做什么和不需要做什么。并且还要在执行查询方面的工作之间进行平衡,或者只是查询所有内容并按代码进行过滤(这实际上取决于您可以在该特定种类中拥有的最大实体个数)。
但是,如果您尝试执行一些对用户可用的复杂查询,那么也许不是数据存储的选择。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句