当前位置:嗨网首页>书籍在线阅读

14-评估查询

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

22.3.4 评估查询

分析MongoDB数据库查询 在本节中,您将使用方法explain()来查看MongoDB为针对示例数据库的查询使用的查询计划。这个示例演示了如何对Cursor对象调用方法explain(),并查看结果。 请执行如下步骤,对一个数据库查询运行explain()。 1.确保启动了MongoDB服务器。 2.确保运行了生成数据库words的脚本文件code/hour05/generate_words.js。 3.使用下面的命令启动MongoDB shell: 4.使用下面的命令切换到数据库words: 5.执行下面的语句,对一个针对示例数据库的简单查询运行explain(): 6.查看输出;如果查询正常,输出应类似于下面这样。注意到在一个BtreeCursor游标中使用了索引word,而扫描的文档数只有5个,虽然集合包含的文档超过2000个: ▲

使用剖析找出耗时长的操作后,便可对其进行评估,看到MongoDB是如何执行查询的每个步骤的。评估查询通常可帮助您了解查询耗时长的原因。

要对查询进行评估,可对返回的游标调用方法explain(),也可以将这个方法串接到查询请求末尾,如db.collection.find({word: "test"}).explain()。

方法explain()返回一个文档,其中包含有关MongoDB服务器的查询计划的信息。查询计划描述了MongoDB如何找出与查询匹配的文档,包括索引使用情况。了解查询计划有助于优化查询。

表22.4列出了方法explain()返回的文档中的一些重要字段。

表22.4 explain()返回的文档的属性

| 属性 | 描述 | | :----- | :----- | :----- | :----- | | cursor | 使用的游标类型,可能取值如下。 BasicCursor:扫描整个集合 BtreeCursor:表明使用了索引 GeoSearchCursor:表明使用了地理空间索引 | | isMultiKey | 为true时表明查询使用了多键索引 | | n | 与查询参数匹配的文档数 | | nscanned | 操作期间扫描的文档数。通常,您希望n和nscanned尽可能接近,这意味着扫描的文档数是最少的 | | scanAndOrder | 如果为true,表明查询无法按索引顺序来返回排序结果 | | indexOnly | 如果为true,表明查询只需扫描索引,这意味着查询要返回的字段都包含在索引中。这种操作的速度通常是最快的 | | nYields | 为让写入操作能够完成,查询不得不让出读取锁的次数。这指出了繁忙的写入操作对数据库性能的影响程度 | | millis | 完成查询耗用的时间,单位为毫秒 | | indexBounds | 一个文档,包含遍历的索引范围的下限和上限 | | allPlans | 一个数组,包含查询优化器为查询选择索引而运行的查询计划列表 | | oldPlan | 一个文档,包含查询优化器为查询选择的前一个查询计划 | | clauses | 一个数组,包含$or操作的explain属性 | | numQueries | 执行的查询数 |

mongo

▼ Try It Yourself

use words
db.word_stats.find({word:{$in:['test','the','and']}}).explain()
{
         "cursor" : "BtreeCursor word_1 multi",
         "isMultiKey" : false,
         "n" : 3,
         "nscannedObjects" : 3,
         "nscanned" : 5,
         "nscannedObjectsAllPlans" : 3,
         "nscannedAllPlans" : 5,
         "scanAndOrder" : false,
         "indexOnly" : false,
         "nYields" : 0,
         "nChunkSkips" : 0,
         "millis" : 0,
         "indexBounds" : {
                  "word" : [
                            [
                                    "and",
                                    "and"
                            ],
                            [
                                    "test",
                                    "test"
                            ],
                            [
                                    "the",
                                    "the"
                            ]
                  ]
         },
         "server" : "bdub:27017"
}