Google cloud firestore 数据存储模式下的Firestore:枚举属性值的索引热点与较差的索引?

Google cloud firestore 数据存储模式下的Firestore:枚举属性值的索引热点与较差的索引?,google-cloud-firestore,google-cloud-datastore,Google Cloud Firestore,Google Cloud Datastore,我遇到的症状表明,当查询由许多其他实体共享的属性时,数据存储模式下的Cloud Firestore可能会变慢。似乎这可能与效率低下的无索引查询有关,例如,我需要一个用于此搜索的复合索引,或者一个索引热点,尽管我只能找到反对单调递增值的文档,而不是少量枚举值 我的情况如下: 我有100万个实体只使用内置的 指数 所有实体都具有以下属性:prop1='All' 所有实体都有一个唯一的属性,['000000'-'999999']中的id,以及 另一个属性,id2=id 所有实体的1/10,因此10万个

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

我的情况如下:

我有100万个实体只使用内置的 指数 所有实体都具有以下属性:prop1='All' 所有实体都有一个唯一的属性,['000000'-'999999']中的id,以及 另一个属性,id2=id 所有实体的1/10,因此10万个实体的属性为“0” 因此,我可以使用云控制台中的GCL或通过Java API查询相同实体的几种方法:

从id为'000000'的种类中选择* 从id='000000'和first_dig='0'的种类中选择* 从id='000000'和first_dig='0'和id2='000000'的种类中选择* 从id为'000000'且first_dig为'0'且prop1为'all'的种类中选择* 我发现查询1需要5秒,查询2需要15秒,查询3需要15秒,查询4需要50秒。事实上,4比2慢得多,但3不比2慢,这让我认为在搜索prop1='all'时,存在索引热点,其中所有索引项可能位于同一平板电脑上,但id2='000000'不存在

我的问题是:

是什么导致了经济放缓?我错过了什么吗? 是否有一种推荐的做法来查询具有低唯一性的索引属性? 谢谢


注意,这是交叉发布到的,但这似乎是一个更合适的位置。

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

也就是说,你正在打原因3


至于热插销,这表现为较慢的写入速度,而不是较慢的查询速度。

您试图使用简单的查询来查询庞大的数据存储,当您的数据存储不包含太多的数据时,这种查询效果会很好。你需要做的是。检查一下如何创建它们。安说,锯齿形合并连接最糟糕的性能是匹配单个索引扫描的最小实体集的Osize。请参阅本文的性能部分。如果在我的例子中是这样,那么添加另一个,只会提高性能。你知道我在这里遗漏了什么吗?也许这个性能声明是错误的。谢谢每个查询都由一个索引提供服务,因此第一个查询由一个索引提供服务。第三个和第四个查询需要检查3个索引,因此,即使渐近顺序相同,限制数越高,常数越高。