Datastore模式中的Firestore:枚举属性值的索引热点与不良索引的索引热点?

问题描述 投票:0回答:1

我遇到的症状表明,在查询许多其他实体共享的属性时,数据存储模式下的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,但这似乎是一个更合适的地方。

google-cloud-firestore google-cloud-datastore
1个回答
0
投票

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

即您正在通过“Why is my Cloud Firestore query slow?”达到原因3。

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

© www.soinside.com 2019 - 2024. All rights reserved.