【问题标题】:Are built-in index based ancestor queries efficient?基于内置索引的祖先查询是否有效?
【发布时间】:2019-12-24 02:43:28
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: google-cloud-datastore


    【解决方案1】:

    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

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

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

    MyKind,A,1,(MyAncestor, 1)

    后缀就是所有以(MyAncestor,1)为前缀和A=1的键。

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

    如果您有兴趣,视频Google I/O 2010 - Next gen queries 将深入探讨。

    【讨论】:

    • 我在这里添加了很多上下文,但要回答您非常具体的问题:索引(复合和内置)始终包含最后的键(实际查找实体所需的),它Cloud Datastore 是如何高效地做到这一点的。
    • 谢谢,对我来说缺少的部分是最后的键也是排序的。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-12-06
      • 2011-09-22
      • 2017-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多