【发布时间】:2015-03-22 15:41:22
【问题描述】:
我在理解 GAE 数据存储区中的索引如何工作时遇到了一些问题,特别是对我来说真正不清楚的是与索引相关的限制。
据我了解,可以在 datastore-indexes.xml 文件中创建一些自定义索引,此外,Datastore 将生成一些自动索引以匹配用户查询。
第一个问题是:配额页面 (https://cloud.google.com/appengine/docs/quotas#Datastore) 中定义的“索引数量”配额限制仅适用于 datastore-indexes.xml 中定义的自定义索引,还是也适用于自动生成的索引?
另一个让我难以理解的概念是“单个查询的索引条目”。
假设我没有多维属性(即没有列表)并且我有一些“KindA”类型的实体。然后我定义了两组实体属性:
- Group1:具有任意名称和布尔值的属性
- Group2:具有任意名称和双值的属性
在我的世界中,任何 KindA 实体最多可以具有 Group1 的 N 个属性和 Group2 的 N 个属性。对于任何属性 P,都会创建一个索引表,并且每个具有该 P 集的实体都将在 P 索引表中添加一行(对吗?)。因此,最初任何 KindA 实体对于每个最大值都有 1 个条目。 2N 个属性(因此每个实体总共最多 2N 个索引条目)对吗?
如果这是正确的,那么我可以创建一个具有有限数量属性的实体,但这很奇怪,因为我一直读到一个实体可以有无限的属性......(不考虑大小限制)。
但是,现在假设我的应用程序允许用户使用对 Group1 属性(布尔值)的任意长的 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 的属性来订购呢?在这种情况下,我需要任何不同查询权限的索引(在过滤属性名称的组合方面不同)?
在我的developmnet 服务器中,我尝试不指定任何自定义索引,GAE 为我生成它们(但是任何时候我重新启动以前生成的索引都会被删除)。在这种情况下,一个单一的 KindA 实体在单个查询索引中有多少个索引条目?我说 1 是因为 GAE 文档所说的:
该属性也可能包含在您的索引配置文件 (index.yaml) 中声明的其他自定义索引中。如果一个实体没有列表属性,那么它在每个这样的自定义索引中最多有一个条目(对于非祖先索引)或对于实体的每个祖先(对于祖先索引)最多有一个条目
因此,理论上如果 N 是有限的,我对“实体的最大索引条目数”(https://cloud.google.com/appengine/docs/java/datastore/#Java_Quotas_and_limits)是安全的,对吗?
但是接收超过 200 个不同的查询呢?它是否会导致 GAE 自动生成 200 多个自定义索引(一个用于不同的查询)?如果是,这些索引是否会自动生成影响索引数量限制(即 200)?
如果是,那么我不能让用户这样做(恕我直言,非常基本)查询。我是不是误会了什么?
【问题讨论】:
标签: database google-app-engine indexing google-cloud-datastore