详解MongoDB的explain()函数:返回执行计划和性能指标

yizhihongxing

MongoDB是一款基于文档的数据库,为了优化查询性能,提供了explain()函数用于分析查询语句的执行情况。本文将详细介绍explain()函数的作用和使用方法,并且提供两个实例进行说明。

1. 作用

explain()函数的作用是分析查询语句的执行计划,输出查询过程中的详细信息,包括使用到的索引、扫描文档数、查询时间等,根据输出结果可以优化查询语句、修改索引等,以达到更好的查询性能。

2. 使用方法

explain()函数可以直接在查询语句中使用,格式如下:

db.collection.find(query).explain([verbosity])

其中,query表示查询条件,verbosity表示输出详细程度,有三种:queryPlannerexecutionStatsallPlansExecution,默认是queryPlanner

实例1:

假设我们有一张students表,包含了每个学生的姓名、年龄、成绩等信息,现在我们需要查询年龄大于20岁的学生列表,并且按照成绩从高到低排序。我们可以使用如下查询语句:

db.students.find({age: {$gt: 20}}).sort({score: -1}).limit(10)

输出结果如下:

{ "_id" : ObjectId("6161d87b9ed21bc1fee93c4e"), "name" : "小明", "age" : 25, "score" : 89 }
{ "_id" : ObjectId("6161d87b9ed21bc1fee93c4f"), "name" : "小红", "age" : 23, "score" : 88 }
...

我们也可以使用explain()函数来分析该查询语句的执行计划:

db.students.find({age: {$gt: 20}}).sort({score: -1}).limit(10).explain("executionStats")

输出结果如下:

{
    "executionStats" : {
        "executionSuccess": true,
        "nReturned": 10,
        "executionTimeMillis": 0,
        "totalKeysExamined": 10,
        "totalDocsExamined": 10,
        //......
    },
    //......
}

可以看出这条查询语句使用了executionStats输出详细程度,执行过程中考虑了索引,扫描了10条文档,查询时间为0毫秒。

实例2:

假设我们有一张orders表,包含了每个订单的时间、用户ID、订单状态等信息,我们想获取一个用户在过去7天内提交的所有订单,以及每个订单的详细信息。我们可以使用如下查询语句:

db.orders.aggregate([
{
   $match: {
      userid: "12234567",
      orderdate: {$gte: new Date(new Date().getTime() - (7 * 24 * 60 * 60 * 1000))}
   }
},
{
   $lookup: {
      from: "orderdetails",
      localField : "orderid",
      foreignField : "orderid",
      as : "orderdetails"
   }
}
])

输出结果如下:

{ "_id" : ObjectId("6162279a9ed21bc1fee93c50"), "userid" : "12234567", "orderdate" : "2021-10-08", "orderid" : "10000002", "orderdetails" : [ { "_id" : ObjectId("616237629ed21bc1fee93c51"), "orderid" : "10000002", "productname" : "iPhone 13", "quantity" : 1, "price" : 7999 } ] }
{ "_id" : ObjectId("616227b69ed21bc1fee93c54"), "userid" : "12234567", "orderdate" : "2021-10-08", "orderid" : "10000005", "orderdetails" : [ { "_id" : ObjectId("616238ad9ed21bc1fee93c55"), "orderid" : "10000005", "productname" : "MacBook Pro", "quantity" : 1, "price" : 15999 } ] }
...

我们也可以使用explain()函数来分析该查询语句的执行计划:

db.orders.aggregate([
{
   $match: {
      userid: "12234567",
      orderdate: {$gte: new Date(new Date().getTime() - (7 * 24 * 60 * 60 * 1000))}
   }
},
{
   $lookup: {
      from: "orderdetails",
      localField : "orderid",
      foreignField : "orderid",
      as : "orderdetails"
   }
}
]).explain("executionStats")

输出结果如下:

{
    "stages" : [
        {
            "$cursor" : {
                "query" : {
                    "userid" : "12234567",
                    "orderdate" : { "$gte" : ISODate("2021-10-04T11:09:00.818Z") }
                },
                "queryPlanner" : {
                    "plannerVersion" : 1,
                    "namespace" : "test.orders",
                    "indexFilterSet" : false,
                    "parsedQuery" : {...},
                    "winningPlan" : {
                        "stage" : "FETCH",
                        "inputStage" : {
                            "stage" : "IXSCAN",
                            "keyPattern" : {...}
                            "indexName" : "...",
                            "isMultiKey" : false,
                            "multiKeyPaths" : {...},
                            "isUnique" : false,
                            "isSparse" : false,
                            "isPartial" : false,
                            "indexVersion" : 2,
                            "direction" : {...},
                            "indexBounds" : {...}
                        }
                    },
                    "rejectedPlans" : [...]
                }
            }
        },
        {
            "$lookup" : {
                "from" : "orderdetails",
                "localField" : "orderid",
                "foreignField" : "orderid",
                "as" : "orderdetails"
            }
        }
    ],
    "serverInfo" : {...},
    "ok" : 1,
    //......
}

可以看出这条聚合语句使用了executionStats输出详细程度,其中包括了查询优化器的工作过程,查询计划的选择、拒绝等信息。

3. 结论

通过explain()函数能够更好的分析查询语句的执行计划,便于进行查询优化,通常在开发的过程中需要及时分析查询语句的执行计划,以达到更好的性能优化。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解MongoDB的explain()函数:返回执行计划和性能指标 - Python技术站

(0)
上一篇 2023年3月23日
下一篇 2023年3月23日

相关文章

  • 详解MongoDB的switch_db()函数:切换到指定的数据库

    MongoDB switch_db()函数 switch_db()函数用于切换当前连接的数据库。在MongoDB中,我们可以通过连接字符串的方式连接到数据库,连接字符串包括”mongodb://host:port”和目标数据库名称。但是在不同的业务场景下,我们需要连接到不同的数据库,此时切换数据库就非常重要。 使用方法 switch_db()函数使用语法如下…

    MongoDB函数大全 2023年3月23日
    00
  • 详解MongoDB的get_last_error()函数:获取最后一次错误信息

    MongoDB getLastError()函数攻略 简介 MongoDB是面向文档的数据库管理系统,支持灵活的查询、高效的数据管理以及高度可扩展性。在MongoDB中,getLastError()函数是一个非常重要的函数,用于获取当前数据库操作的最后一条错误信息。 作用 获取数据库最后一条错误信息; 获取最后一条错误操作的相关信息。 使用方法 使用getL…

    MongoDB函数大全 2023年3月23日
    00
  • 详解MongoDB的sort()函数:对查询结果进行排序

    MongoDB的sort()函数使用攻略 sort()函数的作用 sort()函数是用于对查询结果进行排序的函数。MongoDB中的排序方式和SQL中的排序方式类似,都是根据一个或多个字段的值进行排序。 sort()函数的使用方法 sort()函数可以在find()函数之后调用,用于对查询结果进行排序。sort()函数可以传入一个或多个参数,每个参数都是一个…

    MongoDB函数大全 2023年3月23日
    00
  • 详解MongoDB的index_information()函数:获取集合中的所有索引信息

    MongoDB index_information()函数的作用与使用方法 函数简介 MongoDB index_information()函数用于返回指定集合中所有索引的信息。 使用方法 该函数使用方法如下: db.collection.index_information() 其中,db为数据库实例对象,collection为集合对象。通过db.colle…

    MongoDB函数大全 2023年3月23日
    00
  • 详解MongoDB的find()函数:查询集合中的文档

    MongoDB的find()函数 find()函数是MongoDB中最基本的查询函数,其作用是用于查找集合中的文档并返回查询结果。 使用方法 根据指定条件查询 语法:db.collection.find(query,projection) query为查询条件,多个条件可用逗号隔开。可以使用运算符比较、逻辑运算、正则表达式等方法。 projection为指定…

    MongoDB函数大全 2023年3月23日
    00
  • 详解MongoDB的find_one_and_replace()函数:查询并替换一个文档

    MongoDB find_one_and_replace()函数介绍 函数作用 MongoDB中的find_one_and_replace()函数用于查找符合条件的文档并替换为新的文档。该函数会在找到一个匹配条件的文档后立即停止查询,并返回替换后的文档。 函数语法 db.collection.find_one_and_replace( <filter&…

    MongoDB函数大全 2023年3月23日
    00
  • 详解MongoDB的ensure_index()函数:确保集合中存在指定的索引

    MongoDB中的ensure_index()函数用于在一个集合上创建索引。索引可以提高查询的效率,特别是在处理大量数据的时候。 该函数有以下作用和使用方法: 作用 提高查询效率:对于经常会被查询的字段创建索引,可以大幅提高查询效率,降低查询时间。 避免重复插入:通过设置唯一索引,可以避免在同一个字段上出现重复的值,从而保证数据的完整性。 排序:可以对某个字…

    MongoDB函数大全 2023年3月23日
    00
  • 详解MongoDB的current_op()函数:获取当前正在执行的操作

    MongoDB currentOp() 函数详解 currentOp() 函数概述 currentOp() 是 MongoDB 提供的一个用于查询当前操作的函数。可以用来查看 MongoDB 正在进行的操作、查询的状态和正在等待的操作,以及已经完成或者失败的操作等信息。 该函数可以实时查询当前操作,获取数据库运行时的相关信息,这些信息包括: 正在运行的查询;…

    MongoDB函数大全 2023年3月23日
    00
合作推广
合作推广
分享本页
返回顶部