仅为Google数据存储区中的属性数组中的单个值编制索引(而不是索引这些值的每个组合)

时间:2017-01-13 05:15:03

标签: google-cloud-datastore

我正在计划的数据模型将有一些属性“字段”,包括“category / tags”属性,它将是许多标记的列表/数组。

我打算一次查询一个类别。我对索引哪些实体具有类别组合,而不仅仅是单个类别感兴趣。

我没有引用简单的索引特定属性。

奖金问题:

似乎Google数据存储区不喜欢“单调增加”属性值(即时间戳),因为可能它们在形成索引时会在机器上形成热点。 那么只是存储当前的日历日期有用吗?我可以看到,制作更多的“热点”因为24小时内的每个实体对于该属性都具有相同的索引值,是否有某种方式存储一些关于何时记录每个实体的数据?

2 个答案:

答案 0 :(得分:0)

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

"价值观的组合"如果你创建一个包含多个数组类型的复合索引(例如书的作者和标签),并且所有/大多数书籍都有多个作者和多个标签,那么你提到的就是你所提到的。

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

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

  

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

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

答案 1 :(得分:0)

实际上,如上面的回复所述,人们应该不会遇到创建内置索引的问题。但是,具有数组值的属性仍可以在surprising ways中运行。对于多个过滤器,过滤器定义的所有条件必须至少满足一个数组的各个值,以便与查询匹配。这在等于过滤器的情况下不适用。

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