Firestore:复合索引在带有多个where子句的查询上是否表现更好?

时间:2019-05-16 16:35:14

标签: firebase google-cloud-firestore

我有以下代码:

foldersRef.where("ParentID", "==", "1").where("Deleted", "==", false)
  1. 对于此查询,复合索引(索引ParentIDDeleted)是否比单字段索引更好?
  2. 如果我也有ParentIDDeleted的单个字段索引,Firestore会知道使用复合索引吗?
  3. 创建复合索引时,字段顺序重要吗?
  4. 我的.where()子句/函数调用的顺序重要吗?

2 个答案:

答案 0 :(得分:1)

  
      
  1. 此查询的复合索引(索引ParentID和Deleted)是否比单字段索引更好?
  2.   

如果您使用以下代码行:

foldersRef.where("ParentID", "==", "1").where("Deleted", "==", false)

无需任何排序(升序或降序),就无需创建复合索引。 Firestore将自动创建所需的索引。

  
      
  1. 如果我还有用于ParentID和Deleted的单个单字段索引,Firestore会知道使用复合索引吗?
  2.   

不。单字段索引也由Fiestore自动创建。因此,无需为单个字段创建任何索引。除此之外,如果您具有按顺序排列的单独的字段索引,这并不意味着您也为这些字段具有复合索引。您需要创建自己。

  
      
  1. 创建复合索引时,字段顺序重要吗?
  2.   

是的,如果您更改where()调用的顺序,则还需要相应地创建相应的索引。

  
      
  1. .where()子句/函数调用的顺序重要吗?
  2.   

就速度而言,只要您创建正确的索引,就不会。

答案 1 :(得分:0)

  1. 是的,对于读取而言,复合索引的性能要优于单字段索引的合并。它允许Cloud Firestore使用一个索引而不是合并多个单字段索引。
  2. 是的,Cloud Firestore将优先考虑复合索引。
  3. (也为4)。是的,字段的顺序在您的索引定义和查询中都很重要。 foldersRef.where("ParentID", "==", "1").where("Deleted", "==", false)foldersRef.where("Deleted", "==", false).where("ParentID", "==", "1")将需要两个不同的复合索引。