数据存储区模式下的Firestore:枚举属性值的索引热点与不良索引的索引热点?

时间:2019-12-17 23:15:55

标签: google-cloud-firestore google-cloud-datastore

我遇到的症状表明,查询许多其他实体共享的属性时,数据存储模式下的Cloud Firestore会变慢。看来这可能与效率低下的无索引查询(例如,此搜索需要复合索引)或索引热点有关(尽管我只能找到建议单调递增的值而不是少数枚举值的文档)

我的情况(简体)如下:

  • 我有1M个实体写入数据库(只有内置 索引)
  • 所有实体均具有以下属性:prop1 = 'all'
  • 所有实体都具有唯一属性id in ['000000' - '999999'],并且 另一个属性,id2=id
  • 所有实体的1/10(因此100k个实体)具有属性first_dig = '0'

因此,有两种方法可以查询同一实体(在云控制台中使用GCL或通过Java API):

  1. SELECT * FROM kind WHERE id = '000000'
  2. SELECT * FROM kind WHERE id = '000000' AND first_dig = '0'
  3. SELECT * FROM kind WHERE id = '000000' AND first_dig = '0' AND id2 = '000000'
  4. SELECT * FROM kind WHERE id = '000000' AND first_dig = '0' AND prop1 = 'all'

我发现查询#1需要5秒,#2需要15秒,#3需要15秒,而#4需要约50秒。 #4比#2慢很多,但#3不比#2慢,这一事实使我认为搜索prop1='all'时存在索引热点(所有索引条目都可能在同一平板电脑上)但不适用于id2='000000'

我的问题是:

  1. 是什么原因导致这里的速度下降?有什么我想念的吗?
  2. 是否有建议的做法来查询唯一性较低的索引属性?

谢谢!

请注意,这是交叉发布到https://groups.google.com/forum/#!topic/google-appengine/91jCVQXZ6tI的地方,但这似乎是一个更合适的地方。

1 个答案:

答案 0 :(得分:0)

没有复合索引,此查询将执行锯齿形合并联接,这意味着每个AND操作要做的工作更多,并且具有特定属性值的实体越多,需要过滤的实体越多。

即您是“Why is my Cloud Firestore query slow?”的原因#3。

关于热点,显示为较慢的写入,而不是较慢的查询。