【问题标题】:Firestore: Does a composite index perform better on queries with multiple where clauses?Firestore:复合索引在具有多个 where 子句的查询上表现更好吗?
【发布时间】:2019-10-03 23:54:31
【问题描述】:
我有以下代码:
foldersRef.where("ParentID", "==", "1").where("Deleted", "==", false)
- 对于此查询,复合索引(索引
ParentID 和Deleted)是否比单字段索引更可取?
- 如果我也有
ParentID 和 Deleted 的单独单字段索引,Firestore 会知道使用复合索引吗?
- 创建复合索引时,字段的顺序是否重要?
-
.where() 子句/函数调用的顺序重要吗?
【问题讨论】:
标签:
firebase
google-cloud-firestore
【解决方案1】:
- 对于此查询,复合索引(索引 ParentID 和 Deleted)是否优于单字段索引?
如果您使用以下代码行:
foldersRef.where("ParentID", "==", "1").where("Deleted", "==", false)
没有任何排序(ASCENDING 或 DESCENDING),就不需要创建复合索引。 Firestore 会自动创建所需的索引。
- 如果我还有 ParentID 和 Deleted 的单个单字段索引,Firestore 会知道使用复合索引吗?
没有。 Fiestore 也会自动创建单字段索引。因此无需为单个文件创建任何索引。除此之外,如果您有单独的带有排序的字段索引,这并不意味着您也有这些字段的复合索引。你需要自己创造。
- 创建复合索引时,字段的顺序是否重要?
是的,如果您更改where() 调用的顺序,您还需要相应地创建相应的索引。
- 我的 .where() 子句/函数调用的顺序重要吗?
在速度方面,只要创建正确的索引,就没有。
【解决方案2】:
- 是的,对于读取,复合索引将比单字段索引的合并执行得更好。它允许 Cloud Firestore 使用一个索引,而不是合并多个单字段索引。
- 是的,Cloud Firestore 将优先考虑复合索引。
- (也是 4。)是的,字段的顺序在您的索引定义和查询中都很重要。
foldersRef.where("ParentID", "==", "1").where("Deleted", "==", false) 和 foldersRef.where("Deleted", "==", false).where("ParentID", "==", "1") 需要两个不同的复合索引。