首页 > 解决方案 > MongoDB totalKeysExamined 和 totalDocsExamined 有什么区别

问题描述

我在 MongoDB 中有一个用户集合。我已将“状态”键定义为如下索引:

db.users.createIndex("status": 1)

我正在尝试查找其状态设置为“活动”的所有用户。

我在数据库中共有 24 个用户。其中有 17 个是活跃的。

执行下一个命令时:

db.users.find("status": "Active").explain("executionStats")

我收到下一个:

"executionStats" : {
        "executionSuccess" : true,
        "nReturned" : 17,
        "executionTimeMillis" : 2,
        "totalKeysExamined" : 17,
        "totalDocsExamined" : 17,
...

totalDocsExamined很清楚 - Mongo总共扫描了 17 个文档并跳过了其余的 7 个(请记住,我们总共收集了 24 个用户)。这太棒了,而且非常有效——因为我要求查找并拥有每个文档的数据。

但是当我做同样的查询,但现在使用.count()方法时——我不想让 Mongo 扫描 17 条记录,我希望他扫描 0 条记录并立即给我结果的总数——而不是在整个数据库上迭代——因为当有数十亿条记录时,这个任务可以关闭整个服务器。

所以我这样做:

db.users.explain("executionStats").find("status": "Active").count()

我收到这个:

"executionStats" : {
        "executionSuccess" : true,
        "nReturned" : 0,
        "executionTimeMillis" : 0,
        "totalKeysExamined" : 18,
        "totalDocsExamined" : 0,

如您所见:totalDocsExamined 为 0 - 这很好。但是 totalKeysExamined 是 18!

Mongo 是否遍历了这 18 条记录来告诉我有 18 条记录?它有效率吗?如果此集合中有 2.5b 条具有相同状态的记录?由于我不需要计数查询的数据,而只需要计数 - 这个查询有效吗?

顺便说一句 - 当从 explain 方法中删除 executionStats 时,Mongo 返回 17 条记录是准确的。只有在使用 executionStats 时它检查了 18 个键 - 为什么 Mongo 检查了额外的键?

标签: databasemongodbperformancecountnosql

解决方案


推荐阅读