我正在尝试使用Firestore在应用程序中启用各种查询,最近我不得不添加几个复合索引以允许它们工作。但是我注意到查询中有很多重叠,想知道是否可以通过索引合并来合并其中的一些。
我的应用程序需要从Firestore过滤、排序和分页数据,所以我添加了这样的索引来使它们都能工作:
[
// allows sorting
[
["price", "desc"],
["term", "asc"]
],
[
["price", "asc"],
["term", "asc"]
],
[
["gName", "asc"],
["term", "asc"],
["title", "desc"]
],
[
["term", "asc"],
["gName", "asc"],
["title", "asc"]
],
// allows filtering (and sorting)
[
["gId", "asc"],
["price", "desc"],
["term", "asc"]
],
[
["gId", "asc"],
["price", "asc"],
["term", "asc"]
],
[
["gId", "asc"],
["gName", "asc"],
["term", "asc"],
["title", "asc"]
],
[
["gId", "asc"],
["term", "asc"],
["gName", "asc"],
["title", "asc"]
],
]
字符串
前四个使各种排序选项能够工作,但是当我需要能够过滤数据时(通过使用where(“gId”,“in”,[...])查询),同时保持我已经得到的排序选项工作,我发现我需要使用与以前相同的值添加四个索引,但只是从额外的“gId”约束开始。
这些指数之间似乎有很多重叠。我想知道其中一些是否可以合并以减少所需索引的数量。文档页面上的示例对我来说不清楚在我的情况下哪些字段可以合并,哪些字段不能合并。
如何合并这些索引以利用索引合并,同时仍然允许所有查询工作?或者这在我的情况下是可能的吗?
谢谢你,谢谢
2条答案
按热度按时间hgc7kmma1#
来自单字段索引支持的查询的文档:
使用这些自动创建的单字段索引,您可以运行如下简单查询:
字符串
您还可以创建in和复合相等(==)查询:
型
如果需要运行使用范围比较(<、<=、>或>=)的复合查询,或者需要按不同的字段排序,则必须为该查询创建复合索引。
因此Firestore * 能够为查询使用多个单字段索引,但仅限于查询仅在这些字段上使用相等条件的情况。
对于不满足这些条件的查询(例如任何多字段查询,您必须指定
orderBy
子句),需要专用的复合索引。Firestore不查找非重叠索引,而是查找与所需字段的前缀/后缀(取决于您开始考虑的位置)匹配的一组索引,直到它满足排序子句或范围条件。
如果你感兴趣,我建议你看看我几年前在how to implement geoqueries on NoSQL databases上的视频,或者Alfred在zigzag merge join in Datastore上的更老的视频(现在称为“索引合并”的旧名称)。
dw1jzc5e2#
如果您被要求为某个特定的查询创建一个索引,那么您以前拥有的任何其他索引都无法覆盖这种情况。当查询需要排序时,排序的方向很重要。一个索引不能覆盖两个排序方向(这就是为什么在两种情况下都要求创建一个索引)。最后,应用程序通常会为每个可能的过滤器和排序组合创建索引,就像这样。这是不可避免的,为了让Firestore继续执行大规模的查询,同时保证恒定的性能。
您可以通过删除索引并尝试所有必要的查询来测试它们是否仍然有效。如果它们都还能工作,那么你就不再需要索引了。由于我们不能看到所有的查询,所以我们真的不知道索引是否是必要的。