基于内置索引的祖先查询是否有效?
Are built-in index based ancestor queries efficient?
https://cloud.google.com/datastore/docs/concepts/indexes 处的索引文档说内置的单个 属性 索引可以支持
仅使用祖先和相等过滤器的查询
仅使用不等式过滤器的查询(仅限于单个 属性)
由于 属性 的内置索引按 属性 值排序,我理解它如何支持单个不等式过滤器。但是,它是如何支持带有祖先查询的相等过滤器的呢?假设我有一百万行相同的 属性 值,但给定的祖先条件仅匹配那百万行中的 100 行,是否必须扫描所有百万行才能找到 100 行匹配?我认为情况并非如此,因为我读到 Cloud Datastore 根据结果集中的行数而不是数据库中的行数进行扩展。因此,除非单个 属性 索引在内部是一个多列索引,第一列作为 属性,第二列作为实体键,否则我看不出这些祖先 + 相等查询是如何实现的内置单个 属性 查询得到有效支持。
根据 this 文档 "The rows of an index table are sorted first by ancestor and then by property values, in the order specified in the index definition."
Cloud Datastore 内置索引在查询时始终拆分为前缀和后缀。前缀部分是保持不变的部分(例如等式或祖先),后缀部分是变化的部分(排序顺序)。
内置索引的布局:
Kind, PropertyName, PropertyValue, Key
例如查询:FROM MyKind WHERE A > 1
将 prefix/postfix 划分为:
MyKind,A | range<1, inf>
如果你问的是 (ancestor with equality),FROM MyKind WHERE __key__ HAS ANCESTOR Key('MyAncestor', 1) AND A = 1
前缀的第一部分很简单:
MyKind,A,1
要理解祖先部分,我们必须考虑 Datastore 键是一个层次结构。在 MyKind
的情况下,键可能看起来像:(MyAncestor, 1, MyKind, 345)
。
这意味着我们可以将祖先 + 相等查询的前缀设为:
MyKind,A,1,(MyAncestor, 1)
后缀就是所有以 (MyAncestor,1)
作为前缀和 A=1
的键。
这就是为什么您可以使用内置索引与祖先相等,但不能与祖先不相等。
如果您感兴趣,视频 Google I/O 2010 - Next gen queries 将对此进行深入探讨。
https://cloud.google.com/datastore/docs/concepts/indexes 处的索引文档说内置的单个 属性 索引可以支持
仅使用祖先和相等过滤器的查询
仅使用不等式过滤器的查询(仅限于单个 属性)
由于 属性 的内置索引按 属性 值排序,我理解它如何支持单个不等式过滤器。但是,它是如何支持带有祖先查询的相等过滤器的呢?假设我有一百万行相同的 属性 值,但给定的祖先条件仅匹配那百万行中的 100 行,是否必须扫描所有百万行才能找到 100 行匹配?我认为情况并非如此,因为我读到 Cloud Datastore 根据结果集中的行数而不是数据库中的行数进行扩展。因此,除非单个 属性 索引在内部是一个多列索引,第一列作为 属性,第二列作为实体键,否则我看不出这些祖先 + 相等查询是如何实现的内置单个 属性 查询得到有效支持。
根据 this 文档 "The rows of an index table are sorted first by ancestor and then by property values, in the order specified in the index definition."
Cloud Datastore 内置索引在查询时始终拆分为前缀和后缀。前缀部分是保持不变的部分(例如等式或祖先),后缀部分是变化的部分(排序顺序)。
内置索引的布局:
Kind, PropertyName, PropertyValue, Key
例如查询:FROM MyKind WHERE A > 1
将 prefix/postfix 划分为:
MyKind,A | range<1, inf>
如果你问的是 (ancestor with equality),FROM MyKind WHERE __key__ HAS ANCESTOR Key('MyAncestor', 1) AND A = 1
前缀的第一部分很简单:
MyKind,A,1
要理解祖先部分,我们必须考虑 Datastore 键是一个层次结构。在 MyKind
的情况下,键可能看起来像:(MyAncestor, 1, MyKind, 345)
。
这意味着我们可以将祖先 + 相等查询的前缀设为:
MyKind,A,1,(MyAncestor, 1)
后缀就是所有以 (MyAncestor,1)
作为前缀和 A=1
的键。
这就是为什么您可以使用内置索引与祖先相等,但不能与祖先不相等。
如果您感兴趣,视频 Google I/O 2010 - Next gen queries 将对此进行深入探讨。