我遇到的症状表明,查询许多其他实体共享的属性时,数据存储模式下的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的地方,但这似乎是一个更合适的地方。
答案 0 :(得分:0)
没有复合索引,此查询将执行锯齿形合并联接,这意味着每个AND操作要做的工作更多,并且具有特定属性值的实体越多,需要过滤的实体越多。>
即您是“Why is my Cloud Firestore query slow?”的原因#3。
关于热点,显示为较慢的写入,而不是较慢的查询。