Firestore复合索引:有效基数分析与字段顺序优化问询
Firestore索引基数与字段顺序优化建议
问题1:domain的有效基数是否为1?
是的。在每个用户仅关联一个域名的场景下,当你通过owner_id过滤到特定用户后,该用户对应的domain值是唯一的,不会产生多值分支。此时domain的过滤条件并没有进一步缩小查询结果集的范围,它的有效基数就是1。
问题2:是否需要调整索引字段顺序?
需要调整,推荐两种优化方案:
- 方案一:将
category置于domain之前,索引顺序为:owner_id(升序) →category(升序) →domain(升序) →date(降序) - 方案二:将
domain放在排序字段date之前的最后一位,索引顺序为:owner_id(升序) →category(升序) →date(降序) →domain(升序)
调整原因:
Firestore复合索引的查询效率取决于字段的过滤能力:
category有10个唯一值,在owner_id过滤后,它能有效缩小结果集范围domain此时有效基数为1,几乎没有过滤价值,放在高过滤能力的字段之后,能让索引更快定位到目标数据- 调整后依然包含所有查询用到的过滤字段(
owner_id、domain、category)和排序字段(date),完全满足当前查询需求,同时适配安全规则的要求
调整后的查询兼容性
当前客户端查询语句无需修改,调整索引顺序后依然可以正常执行:
let query = try db.firestore.collection("Collection") .whereField("owner_id", isEqualTo: "someUserId") .whereField("domain", isEqualTo: "domain1") .whereField("category", isEqualTo: "Entertainment") .order(by: "date")
内容的提问来源于stack exchange,提问作者Khaled Sh
相关产品推荐
相关产品推荐

