database - 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 检查了额外的键?
解决方案
推荐阅读
- android - 如何在 Android 中获取仪器测试的代码覆盖率
- javascript - 纹理未加载到对象上
- python-3.x - 编写一个函数,从字符串中删除所有出现的给定字母
- google-cloud-platform - 当应用程序请求登录时,Google Oauth 提供了额外的范围
- c - 在命令行中声明 -n 参数以接受整数 - C
- c# - Swagger UI 未在 azure .net 核心中生成,但在本地工作
- flutter - 如何在 Flutter 中查找内存泄漏?
- azure-bot-service - Skype 将不再接受新的 Bot 注册?
- java - 如何提取正则表达式的第一部分?
- java - 在 RestAssured JPath 中按名称查找节点