Firestore带不等值条件的查询无对应索引仍执行成功的原因
该查询无完全匹配索引仍可成功执行的原因
你编写的查询语句如下:
.where("field1", "<", 10) .where("field2", "==", false) .where("field3", "==", "test1") .where("field4", "==", "test2")
你已创建的相关复合索引:
field1 DESC field2 ASC field3 ASC field1 DESC field2 ASC field4 ASC
你此前认为索引合并仅适用于不含不等值条件的查询,这个认知已经和Firestore当前的规则不符。现在Firestore的索引合并能力已经支持带范围(不等值)过滤条件的查询,满足以下两个前提即可触发:
- 所有参与合并的索引,必须将范围过滤字段放在完全一致的索引前缀位置
- 范围过滤字段之后的等值过滤字段,可分别归属到不同的参与合并的索引中
你的查询场景完全符合索引合并的触发要求:
- 两个已创建的复合索引,都把带不等值条件的
field1放在索引第一列,后面紧跟等值过滤字段field2,索引公共前缀完全匹配,满足范围查询的索引合并前置规则 - 第一个索引在公共前缀后覆盖了等值条件字段
field3,第二个索引在公共前缀后覆盖了等值条件字段field4。查询执行时,Firestore会先基于两个索引的公共前缀完成field1 < 10、field2 == false的过滤,再分别匹配field3 == "test1"和field4 == "test2"的等值条件,最后对两个索引返回的结果集取交集,就能得到准确的查询结果,不需要单独创建覆盖四个字段的全量复合索引。
内容的提问来源于stack exchange,提问作者l1b3rty
相关产品推荐
相关产品推荐

