MongoDB 操作手册CRUD 查询性能分析

分析查询性能

explain() cursor方法允许观察查询系统执行的操作。这个方法对于分析高效查询和决定如何使用索引进行查询是十分有用的。这个方法检测的是查询的操作,而不是查询执行时间。因为这个方法尝试多个查询计划,它并不能准确的反映出查询执行时间。

评估一个查询的性能

使用explain()方法,调用find()返回的指针的该方法即可。

例:

在type字段创建索引

db.testData.ensureIndex({‘type‘:1});

评估一个在type字段上的查询。

db.testData.find({type:‘food‘}).explain()

结果如下:

{

"cursor" : "BtreeCursor type_1",

"isMultiKey" : false,

"n" : 3,

"nscannedObjects" : 3,

"nscanned" : 3,

"nscannedObjectsAllPlans" : 3,

"nscannedAllPlans" : 3,

"scanAndOrder" : false,

"indexOnly" : false,

"nYields" : 1,

"nChunkSkips" : 0,

"millis" : 64,

"indexBounds" : {

"type" : [

[

"food",

"food"

]

]

},

"server" : "TT:27017",

"filterSet" : false

}

cursor值为BtreeCursor表名查询使用了索引。

查询返回n=3条记录。

为了返回这五条记录,查询扫描了nscanned=3条记录,然后读到了nscannedObjects=3条完整的记录,如果没有索引,将扫描所有记录。

比较索引查询性能

手动比较一个使用多个字段的查询,可以联合使用hint()和explain()方法。

例:评估使用不同字段的索引

db.testData.find({type:‘food‘}).hint({type:1}).explain();

结果:

{

"cursor" : "BtreeCursor type_1",

"isMultiKey" : false,

"n" : 3,

"nscannedObjects" : 3,

"nscanned" : 3,

"nscannedObjectsAllPlans" : 3,

"nscannedAllPlans" : 3,

"scanAndOrder" : false,

"indexOnly" : false,

"nYields" : 0,

"nChunkSkips" : 0,

"millis" : 40,

"indexBounds" : {

"type" : [

[

"food",

"food"

]

]

},

"server" : "TT:27017",

"filterSet" : false

}

db.testData.find( { type: ‘food‘ } ).hint( { type: 1, name: 1 } ).explain();

//这句话执行不成功,待解决

这些返回的统计结果忽略了使用各自的索引的执行的查询。

注意:如果不适用hint()执行explain()方法,查询优化器将重新评估查询,并且在返回查询统计之前运行多索引查询。

更详细的explain输出,查看explain-results。

时间: 2024-08-03 16:57:25

MongoDB 操作手册CRUD 查询性能分析的相关文章

MongoDB 操作手册CRUD查询

查询操作 基本查询 查询指定集合中的所有记录 db.testData.find()或者db.testData.find({}); 相等条件查询 db.testData.find({num:5});//查询num=5的记录 使用查询操作符声明多个条件 db.testData.find({num:{$in:[2,3,4]}});查询num为2,3,4的记录. 尽管可以使用$or操作符来执行同样的查询,但是当多个or条件都是在同一字段上的相等判断时,请使用$in而不是$or. and条件查询 db.t

MongoDB 操作手册CRUD查询指针

枚举遍历指针 概述 前面已经讲过,db.collection.find()如果没有指定给一个var声明的变量,将自动枚举前20条记录. 手动枚举指针 在mongo控制台中,将查询赋给一个var声明的变量,让其不自动枚举. var cur = db.testData.find(); 然后每次调用这个指针,将自动遍历20条 cur; 也可以使用指针的next()方法来获取下一条记录 var cur = db.testData.find(); while(cur.hasNext()) { print(

MongoDB 操作手册CRUD 事务 两步提交

执行两步提交 概述 这部分提供了多记录更新或者多记录事务,使用两步提交来完成多记录写入的模板.另外,可以扩展此方法来提供rollback-like功能. 背景 MongoDB对于单条记录的操作是原子性的:但是涉及多条记录的操作却不是原子性的.由于记录可能是相当复杂,并且有内嵌记录,单记录原子性操作提供了实际中常用的必要支持. 除了单记录的原子性操作,还有许多情况需要多记录操作事务,当执行一个包含一些列操作的事务时,就有以下要求: 原子性:如果一个操作失败,事务中之前的操作需要回滚到之前的状态 一

MongoDB 操作手册CRUD 删除 remove

删除记录 概述 在MongoDB中,db.collection.remove()方法用于删除集合中的记录.可以删除所有记录,删除所有符合条件的记录,或者是仅删除一条记录. 删除所有记录 删除一个集合中的所有记录,只要将一个空的查询对象{}传给remove()方法即可.remove()方法不删除索引. 例:db.testData.remove({}); 使用remove()方法删除一个集合中的所有记录,可能比使用drop()方法删除包含索引的整个集合,再重建集合和索引更高效. 删除符合条件的记录

MongoDB 操作手册CRUD 更新 update

修改记录 概述 MongoDB提供了update()方法用于更新记录.这个方法接受以下参数: 一个更新条件的JSON对象用于匹配记录,一个更新操作JSON对象用于声明更新操作,和一个选项JSON对象 声明查询条件,使用和查询一样的结构和语法. 默认情况下,update()更新单条记录,若要更新多条记录, 请使用multi选项. 更新记录中的指定字段 用于更新某个字段的某个值,MongoDB提供了update操作符,比如$set. 在执行更新操作时,一些操作符回创建没有的字段,如$set. 测试数

MongoDB 操作手册CRUD插入

插入操作 插入记录 1.插入一条记录 db.testData.insert({num:1,name:'a'}); 结果 WriteResult({ "nInserted" : 1 }) 2.查看插入的记录 db.testData.find(); 插入数组 1.定义数组 var arr = [{num:1,name:'a'},{num:2,name:'b'},{num:3,name:'c'}]; 2.插入记录 db.testData.insert(arr); 结果 nInserted显示

sql查询性能分析

SQL查询性能分析 http://blog.csdn.net/dba_huangzj/article/details/7623926 五分钟打造自己的sql性能分析工具 http://www.cnblogs.com/gezifeiyang/p/3403744.html sql查询性能分析,布布扣,bubuko.com

玩转mongodb(五):mongodb 3.0+ 查询性能分析

mongodb性能分析方法:explain() 为了演示的效果,我们先来创建一个有200万个文档的记录.(我自己的电脑耗了15分钟左右插入完成.如果你想插更多的文档也没问题,只要有耐心等就可以了.) 1 for(var i=0;i<2000000;i++){ 2 db.person.insert({"name":"ryan"+i,"age":i}); 3 } MongoDB 3.0之后,explain的返回与使用方法与之前版本有了很大的变化

MySQL的limit用法和分页查询的性能分析及优化

申明:本博文转发于 点击链接跳转 一.limit用法在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能. SELECT * FROM table LIMIT [offset,] rows | `rows OFFSET offset ` (LIMIT offset, `length`)SELECT*FROM tablewhere condition1 = 0and condition2 = 0and condition3