一看就懂的MongoDB索引优化

本文介绍了MongoDB的索引优化,通过查看执行计划的queryPlanner和executionStats,分析了不同stage的意义,强调了避免COLLSCAN、SORT等耗时操作的重要性。文章通过实例展示了如何根据查询需求创建和调整索引,以提高查询效率。
摘要由CSDN通过智能技术生成

查看执行计划

索引优化是一个永远都绕不过的话题,作为NoSQL的MongoDB也不例外。Mysql中通过explain命令来查看对应的索引信息,MongoDB亦如此。

1. db.collection.explain().<method(...)>
    db.products.explain().remove( { category: "apparel" }, { justOne: true })

2. db.collection.<method(...)>.explain({})
    db.products.remove( { category: "apparel" }, { justOne: true }).explain()

如果你是在mongoshell 中第一种和第二种没什么区别,如果你是在robot 3T这样的客户端工具中使用你必须在后面显示调用finish()或者next()

db.collection.explain().find({}).finish()

explain有三种模式,分别是:

  1. queryPlanner(默认) :queryPlanner模式下并不会去真正进行query语句查询,而是针对query语句进行执行计划分析并选出winning plan
  2. executionStats :MongoDB运行查询优化器以选择获胜计划(winning plan),执行获胜计划直至完成,并返回描述获胜计划执行情况的统计信息。
  3. allPlansExecution: queryPlanner和executionStats都返回。相当于 explain("allPlansExecution") = explain({})

queryPlanner(查询计划)

日志表中存储了用户的操作日志,我们经常查询某一篇文章的操作日志,数据如下:

{
  "_id" : NumberLong(7277744),
  "operatorName" : "autotest_cp",
  "operateTimeUnix" : NumberLong(1586511800890),
  "module" : "ARTICLE",
  "opType" : "CREATE",
  "level" : "GENERAL",
  "recordData" : {
      "articleId" : "6153324",
      "categories" : "100006",
      "title" : "testCase-2 this article is created for cp edior to search",
      "status" : "DRAFT"
  },
  "responseCode" : 10002
}

集合中大概有700万数据,对于这样的查询语句

db.getCollection('operateLog').find({"module": "ARTICLE", "recordData.articleId": "6153324"}).sort({_id:-1})

首先看下queryPlanner返回的内容:

"queryPlanner" : {
   
  "plannerVersion" : 1,
  "namespace" : "smcp.operateLog",
  "indexFilterSet" : false,
  "parsedQuery" : {
   
    "$and" : [ 
      {
   
        "module" : {
   
            "$eq" : "ARTICLE"
        }
      }, 
      {
   
        "recordData.articleId" : {
   
            "$eq" : "6153324"
        }
      }
    ]
  },
  "winningPlan" : {
   
    "stage" : "FETCH",
    "filter" : {
   
      "$and" : [ 
        {
   
          "module" : {
   
              "$eq" : "ARTICLE"
          }
        }, 
        {
   
          "recordData.articleId" : {
   
              "$eq" : "6153324"
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值