MongoDb 索引搜索 returns 使用字符串包含操作时的整个集合
MongoDb Index Search returns the entire collection when using a string contains operation
为什么 MongoDb (4.2.6) return 索引中的每一行(排序规则 locale
:en_US,strength
:1),在搜索文档字段中包含的字符串时?示例查询:
db.eClearFaces.aggregate()
.match({
"Name": /Test/s
})
.collation({ locale: "en_US", "strength": 1 })
它正在使用的索引是:
名称只是文档中的一个字符串字段。结果查询计划显示集合中的每条记录都是 returned:
您可以在阶段 IXSCAN
中看到,它 return 编辑了 56k+ 个文档(我预计它 return 只有 6 个)。这导致下一阶段获取所有 56k 文档,但在获取的文档中,它 returned 6(正确计数)。
我对为什么感到困惑 - 我将索引和查询的排序规则配置为相同,而且它显然命中了索引。我不明白为什么它 return 将所有这些额外的行都转到下一阶段。
探查器的索引输出:
我是否错过了 MongoDb 索引或查询基础?
解决方案最终出现在 MongoDb 文档中。
The $regex implementation is not collation-aware and is unable to
utilize case-insensitive indexes.
https://www.mongodb.com/docs/manual/reference/operator/query/regex/
因此,提供排序规则最终会影响性能。解决方案是有一个没有整理的索引。它仍然按预期执行索引扫描,但在从 table.
获取之前得到的结果要少得多
为什么 MongoDb (4.2.6) return 索引中的每一行(排序规则 locale
:en_US,strength
:1),在搜索文档字段中包含的字符串时?示例查询:
db.eClearFaces.aggregate()
.match({
"Name": /Test/s
})
.collation({ locale: "en_US", "strength": 1 })
它正在使用的索引是:
名称只是文档中的一个字符串字段。结果查询计划显示集合中的每条记录都是 returned:
您可以在阶段 IXSCAN
中看到,它 return 编辑了 56k+ 个文档(我预计它 return 只有 6 个)。这导致下一阶段获取所有 56k 文档,但在获取的文档中,它 returned 6(正确计数)。
我对为什么感到困惑 - 我将索引和查询的排序规则配置为相同,而且它显然命中了索引。我不明白为什么它 return 将所有这些额外的行都转到下一阶段。
探查器的索引输出:
我是否错过了 MongoDb 索引或查询基础?
解决方案最终出现在 MongoDb 文档中。
The $regex implementation is not collation-aware and is unable to utilize case-insensitive indexes.
https://www.mongodb.com/docs/manual/reference/operator/query/regex/
因此,提供排序规则最终会影响性能。解决方案是有一个没有整理的索引。它仍然按预期执行索引扫描,但在从 table.
获取之前得到的结果要少得多