MongoDB 分析查询

MongoDB 分析查询

分析查询是衡量数据库和索引设计效果的一个非常重要的方面。我们将学习经常使用的 $explain$hint 查询。

使用$explain

$explain 操作符提供有关查询、在查询中使用的索引和其他统计信息的信息。当分析索引的优化程度时,它非常有用。

在上一章中,我们已经为 users 集合创建了一个索引,该索引使用了以下查询条件中的 genderuser_name 字段:

>db.users.createIndex({gender:1,user_name:1})
{
    "numIndexesBefore" : 2,
    "numIndexesAfter" : 2,
    "note" : "all indexes already exist",
    "ok" : 1
}

我们现在将使用 $explain 在下面的查询中 –

>db.users.find({gender:"M"},{user_name:1,_id:0}).explain()

上述 explain() 查询返回以下分析结果 –

{
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "mydb.users",
        "indexFilterSet" : false,
        "parsedQuery" : {
            "gender" : {
                "$eq" : "M"
            }
        },
        "queryHash" : "B4037D3C",
        "planCacheKey" : "DEAAE17C",
        "winningPlan" : {
            "stage" : "PROJECTION_COVERED",
            "transformBy" : {
                "user_name" : 1,
                "_id" : 0
            },
            "inputStage" : {
                "stage" : "IXSCAN",
                "keyPattern" : {
                    "gender" : 1,
                    "user_name" : 1
                },
                "indexName" : "gender_1_user_name_1",
                "isMultiKey" : false,
                "multiKeyPaths" : {
                    "gender" : [ ],
                    "user_name" : [ ]
                },
                "isUnique" : false,
                "isSparse" : false,
                "isPartial" : false,
                "indexVersion" : 2,
                "direction" : "forward",
                "indexBounds" : {
                    "gender" : [
                        "[\"M\", \"M\"]"
                    ],
                    "user_name" : [
                        "[MinKey, MaxKey]"
                    ]
                }
            }
        },
        "rejectedPlans" : [ ]
    },
    "serverInfo" : {
        "host" : "Krishna",
        "port" : 27017,
        "version" : "4.2.1",
        "gitVersion" : "edf6d45851c0b9ee15548f0f847df141764a317e"
    },
    "ok" : 1
}

我们现在来看看这个结果集中的字段:

  • indexOnly 这个字段的真值表示这个查询使用了索引。

  • cursor 字段指定了使用的游标类型。BTreeCursor类型表示使用了索引,并给出了使用的索引的名称。BasicCursor表示没有使用任何索引进行全面扫描。

  • n 表示匹配返回的文档数。

  • nscannedObjects 表示扫描的文档的总数。

  • nscanned 表示扫描的文档或索引条目的总数。

使用$hint

$hint 操作符强制查询优化器使用指定的索引运行查询。当您想要测试不同索引的查询性能时,这非常有用。例如,以下查询指定了字段 genderuser_name 上的索引用于此查询-

>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1})
{ "user_name" : "tombenzamin" }

使用$explain分析上面的查询 –

>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1}).explain()

这将给您以下结果−

{
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "mydb.users",
        "indexFilterSet" : false,
        "parsedQuery" : {
            "gender" : {
                "$eq" : "M"
            }
        },
        "queryHash" : "B4037D3C",
        "planCacheKey" : "DEAAE17C",
        "winningPlan" : {
            "stage" : "PROJECTION_COVERED",
            "transformBy" : {
                "user_name" : 1,
                "_id" : 0
            },
            "inputStage" : {
                "stage" : "IXSCAN",
                "keyPattern" : {
                    "gender" : 1,
                    "user_name" : 1
                },
                "indexName" : "gender_1_user_name_1",
                "isMultiKey" : false,
                "multiKeyPaths" : {
                    "gender" : [ ],
                    "user_name" : [ ]
                },
                "isUnique" : false,
                "isSparse" : false,
                "isPartial" : false,
                "indexVersion" : 2,
                "direction" : "forward",
                "indexBounds" : {
                    "gender" : [
                        "[\"M\", \"M\"]"
                    ],
                    "user_name" : [
                        "[MinKey, MaxKey]"
                    ]
                }
            }
        },
        "rejectedPlans" : [ ]
    },
    "serverInfo" : {
        "host" : "Krishna",
        "port" : 27017,
        "version" : "4.2.1",
        109
        "gitVersion" : "edf6d45851c0b9ee15548f0f847df141764a317e"
    },
    "ok" : 1
}

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程