【问题标题】:Indexing only individual values in property arrays (instead of indexing every combination of those values) in Google datastore在 Google 数据存储中仅索引属性数组中的单个值(而不是索引这些值的每个组合)
【发布时间】:2017-05-28 10:07:56
【问题描述】:

我计划的数据模型将有一些属性“字段”,包括一个“类别/标签”属性,它是一个包含许多标签的列表/数组。

我计划一次查询一个类别。我对索引哪些实体具有类别组合不感兴趣,只是单个类别。

我并没有简单地引用一个特定的属性。

额外问题:

Google 数据存储似乎不喜欢“单调递增”的属性值(即时间戳),因为可能它们在形成索引时会在机器上形成热点。 那么仅存储当前日历日期会有所帮助吗?我可以看到,由于每个实体 24 小时内都将具有相同的索引值,因此我可以看到更多的“热点”属性,有什么方法可以存储有关每个实体何时记录的一些数据?

【问题讨论】:

    标签: google-cloud-datastore


    【解决方案1】:

    确实,正如上面回复中提到的,创建内置索引应该不会遇到任何问题。尽管如此,具有数组值的属性仍然可以在surprising ways 中运行。对于多个过滤器,过滤器定义的所有条件必须至少由数组的单个值之一满足,才能匹配查询。这不适用于相等过滤器的情况。

    排序顺序也很不寻常:索引中看到的第一个值决定了实体的排序顺序。

    【讨论】:

      【解决方案2】:

      我认为 Array 属性上的属性索引(又名内置索引)不会创建具有各种值组合的索引。我相信 Array 中的每个值都被索引。例如,如果您有一本书有两个标签,则索引将为每个标签有两个条目。添加另一本具有三个标签的书会在标签索引中再添加 3 个条目。该索引允许您基于单个标签和多个标签查询书籍。

      如果您创建包含多个数组类型(例如一本书的作者和标签)的复合索引,并且所有/大多数书籍具有多个作者和多个标签,则会发生您提到的“值组合”。

      在类别/标签上创建内置索引应该没有任何问题。

      关于索引实体创建/修改时间戳的其他问题,我确实看到Best Practices 说要避免索引这样的属性。

      不要索引具有单调递增值的属性(例如 NOW() 时间戳)。维持这样的指数可能会导致热点 这会影响具有高读取的应用程序的 Cloud Datastore 延迟 和写入率

      不确定替代方案是什么。如果您不必查询时间戳/对时间戳进行排序,则可以通过从索引中排除属性来存储时间戳。

      【讨论】:

      • 这似乎不是索引与 Google 数据存储一起使用的方式,因为我创建了一些简单的实体,并且为这些实体报告的索引数量比您描述的要多。 .除非我误解了什么。
      • 同样查询“tag1”AND“tag2”有效,但查询“tag1”OR“tag2”无效。这似乎证明了组合索引被自动索引的想法。此外,这是我所知道的唯一一种完全独立于数据库大小进行扩展的方法,而是随结果大小进行扩展。
      • 当您说“索引数”时,您指的是什么? Cloud Datastore 尚不支持 OR 查询。
      • “索引数”=“数据存储仪表板”中报告的“内置索引计数”。
      猜你喜欢
      • 2019-08-24
      • 1970-01-01
      • 2011-12-30
      • 2016-01-29
      • 2012-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多