我遇到的症状表明,在查询许多其他实体共享的属性时,数据存储模式下的Cloud Firestore会变慢。看来这可能与效率低下的无索引查询(例如,此搜索需要复合索引)或索引热点有关(尽管我只能找到建议单调递增的值而不是少数枚举值的文档) 。
我的情况(简体)如下:
prop1 = 'all'
id in ['000000' - '999999']
,并且另一个属性,id2=id
first_dig = '0'
因此,有几种方法可以查询相同的实体(通过在云控制台中使用GCL或通过Java API):
SELECT * FROM kind WHERE id = '000000'
SELECT * FROM kind WHERE id = '000000' AND first_dig = '0'
SELECT * FROM kind WHERE id = '000000' AND first_dig = '0' AND id2 = '000000'
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'
。
我的问题是:
谢谢!
注意,这是交叉发布到https://groups.google.com/forum/#!topic/google-appengine/91jCVQXZ6tI,但这似乎是一个更合适的地方。
没有复合索引,此查询将执行锯齿形合并联接,这意味着每个AND操作要做的工作更多,并且具有特定属性值的实体越多,需要过滤的实体就越多。
即您正在通过“Why is my Cloud Firestore query slow?”达到原因3。
关于热点,显示为较慢的写入,而不是较慢的查询。