内置的基于索引的祖先查询是否有效?

时间:2019-08-18 18:21:41

标签: google-cloud-datastore

https://cloud.google.com/datastore/docs/concepts/indexes处的索引文档说内置的单一属性索引可以支持

  • 仅使用祖先和相等过滤器的查询

  • 仅使用不等式过滤器(仅限于单个属性)的查询

由于属性的内置索引是按属性值排序的,因此我了解它如何支持单个不等式过滤器。但是,如何通过祖先查询支持相等过滤器?假设我有100万行用于相同的属性值,但是给定的祖先条件仅匹配该100万行中的100行,是否需要扫描所有100万行以找到100条匹配行?我认为情况并非如此,因为我读到Cloud Datastore随结果集中的行数而不是数据库中的行数扩展。因此,除非单个属性索引在内部是多列索引,并且第一列作为属性,第二列作为实体键,否则我看不到如何通过内置单个属性有效地支持这些祖先+相等查询查询。

2 个答案:

答案 0 :(得分:0)

根据this文档“索引表的行首先按照祖先,然后按照属性值(在索引定义中指定的顺序)进行排序。”

答案 1 :(得分:0)

Cloud Datastore内置索引始终在查询时分为前缀和后缀。前缀部分是保持不变的部分(例如,等号或祖先),后缀部分是更改的部分(排序顺序)。

构建索引的布局:

Kind, PropertyName, PropertyValue, Key

例如,查询:FROM MyKind WHERE A > 1

将前缀/后缀划分为:

MyKind,A | range<1, inf>

在您要询问(祖先相等)的情况下,FROM MyKind WHERE __key__ HAS ANCESTOR Key('MyAncestor', 1) AND A = 1前缀的第一部分很简单:

MyKind,A,1

要了解祖先,我们必须考虑数据存储键是一个层次结构。对于MyKind,键可能类似于:(MyAncestor, 1, MyKind, 345)

这意味着我们可以将祖先+等式查询的前缀设置为:

MyKind,A,1,(MyAncestor, 1)

后缀将只是具有(MyAncestor,1)作为前缀和A=1的所有键。

这就是为什么您可以使用内置索引与祖先相等,而与祖先不平等。

如果您有兴趣,可以深入了解Google I/O 2010 - Next gen queries视频。