MongoDB 查询分析
MongoDB 查询分析可以确保我们建议的索引是否有效,是查询语句性能分析的重要工具。
MongoDB 查询分析常用函数有:explain() 和 hint()。
使用 explain()
explain 操作提供了查询信息,使用索引及查询统计等。有利于我们对索引的优化。
接下来我们在 users 集合中创建 gender 和 user_name 的索引:
>db.users.ensureIndex({gender:1,user_name:1})</p><p>现在在查询语句中使用 explain :</p><pre>>db.users.find({gender:"M"},{user_name:1,_id:0}).explain()
以上的 explain() 查询返回如下结果:
{ "cursor" : "BtreeCursor gender_1_user_name_1", "isMultiKey" : false, "n" : 1, "nscannedObjects" : 0, "nscanned" : 1, "nscannedObjectsAllPlans" : 0, "nscannedAllPlans" : 1, "scanAndOrder" : false, "indexOnly" : true, "nYields" : 0, "nChunkSkips" : 0, "millis" : 0, "indexBounds" : { "gender" : [ [ "M", "M" ] ], "user_name" : [ [ { "$minElement" : 1 }, { "$maxElement" : 1 } ] ] }}
现在,我们看看这个结果集的字段:
indexOnly: 字段为 true ,表示我们使用了索引。
cursor:因为这个查询使用了索引,mongodb 中索引存储在b树结构中,所以这是也使用了 btreecursor 类型的游标。如果没有使用索引,游标的类型是 basiccursor。这个键还会给出你所使用的索引的名称,你通过这个名称可以查看当前数据库下的system.indexes集合(系统自动创建,由于存储索引信息,这个稍微会提到)来得到索引的详细信息。
n:当前查询返回的文档数量。
nscanned/nscannedObjects:表明当前这次查询一共扫描了集合中多少个文档,我们的目的是,让这个数值和返回文档的数量越接近越好。
millis:当前查询所需时间,毫秒数。
indexBounds:当前查询具体使用的索引。
使用 hint()
虽然MongoDB查询优化器一般工作的很不错,但是也可以使用 hint 来强制 MongoDB 使用一个指定的索引。
这种方法某些情形下会提升性能。 一个有索引的 collection 并且执行一个多字段的查询(一些字段已经索引了)。
如下查询实例指定了使用 gender 和 user_name 索引字段来查询:
>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1})
可以使用 explain() 函数来分析以上查询:
>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1}).explain()
Mongodb慢查询详解
1 resume
0 - the profiler is off, does not collect any data.
1 - collects profiling data for slow operations only. By default slow operations are those slower than 100 milliseconds.
You can modify the threshold for “slow” operations with the slowms runtime option or the setParameter command. See the Specify the Threshold for Slow Operations section for more information.
2 - collects profiling data for all database operations.
2 able
2.1
复制代码 代码示例:
db.setProfilingLevel(2,500);
PRIMARY> db.setProfilingLevel(1,500);
{ "was" : 0, "slowms" : 500, "ok" : 1 }
PRIMARY>
PRIMARY>
PRIMARY>
PRIMARY> db.setProfilingLevel(1,500);
{ "was" : 1, "slowms" : 500, "ok" : 1 }
PRIMARY>
PRIMARY>
PRIMARY>
为什么需要set2次才能生效?
解释:
0代表关闭,1代表只记录slowlog,2代表记录所有操作,这里设置成了500,即500ms。
2.2 check the status
复制代码 代码示例:
PRIMARY> db.getProfilingStatus();
{ "was" : 2, "slowms" : 500 }
PRIMARY> db.getProfilingLevel();
PRIMARY>
复制代码 代码示例:
db.system.profile.find().sort({$natural:-1})
PRIMARY> db.system.profile.find().sort({$natural:-1})
{ "ts" : ISODate("2013-05-14T08:13:37.098Z"), "op" : "insert", "ns" : "test.tickets", "millis" : 0, "client" : "127.0.0.1", "user" : "" }
{ "ts" : ISODate("2013-05-14T08:13:37.098Z"), "op" : "insert", "ns" : "test.tickets", "millis" : 0, "client" : "127.0.0.1", "user" : "" }
{ "ts" : ISODate("2013-05-14T08:13:37.098Z"), "op" : "insert", "ns" : "test.tickets", "millis" : 0, "client" : "127.0.0.1", "user" : "" }
PRIMARY>
ts:时间戳
op: 操作类型
ns:执行操作的对象集合
millis:操作所花时间,毫秒
client: 执行操作的客户端
user: 执行操作的mongodb连接用户
2.4 可以在mongodb启动之初设置slow生效
直接加在启动命令中:mongod --profile=1 --slowms=15
或在配置文件中写好 用-f强制加载配置文件启动mongodb
复制代码 代码示例:
profile=1
slowms=1000
[] 在replicaset中,必须把一个个instance都生效才行。每一个都需要生效一次。
3 see the log
复制代码 代码示例:
db.system.profile.find().limit(10).sort( { ts : -1 } ).pretty();
db.system.profile.find().limit(10).sort( { ts : 1 } ).pretty();
4 Disable Profiling
复制代码 代码示例:
To disable profiling, use the following helper in the mongo shell: set the default value 0;
db.setProfilingLevel(0)
5 当profile表过小时,调整表大小为4MB
复制代码 代码示例:
db.setProfilingLevel(0) -- profile失效
db.system.profile.drop() -- 删除
db.createCollection( "system.profile", { capped: true, size:4000000 } ) -- 重建
db.setProfilingLevel(1) -- profile生效
6 查看出来的慢mongo命令
6.1 显示最新的5条操作记录
show profile;
6.2 显示结果分析,查询大于5毫秒的slow command。
复制代码 代码示例:
db.system.profile.find().sort({millis:-1}).limit(10);
db.system.profile.find( { millis : { $gt : 5 } } ).pretty();
{
"ts" : ISODate("2013-01-16T18:26:18.041Z"),
"op" : "query", -- 执行类型
"ns" : "ssodatabase.exchangetickets", -- 执行collection名称
"query" : {
"xid" : "X15e1481688254bc9a94701b3aa9e7abc627971358360754783"
}, -- 执行的内容
"ntoreturn" : 1,
"nscanned" : 382793,
"nreturned" : 1,
"responseLength" : 605,
"millis" : 5841, -- 执行的时间
"client" : "10.100.10.161", -- 执行的客户端
"user" : "" -- 执行的mongo用户
}
观察结果中的"query"字段。 没有直接db.test.insert({xxxxxxx.....})这样显示的,需要你自己根据query字段去拼接取值.
7 返回特定时间的慢查询记录
7.1普通的时间短查询
复制代码 代码示例:
db.system.profile.find(
{
ts : {
$gt : new ISODate("2013-05-09T03:00:00Z") ,
$lt : new ISODate("2013-05-17T03:40:00Z")
}
}
).pretty();
run the command, follows:
PRIMARY> db.system.profile.find(
... {
... ts : {
... $gt : new ISODate("2013-05-09T03:00:00Z") ,
... $lt : new ISODate("2013-05-17T03:40:00Z")
... }
... }
...).pretty();
{
"ts" : ISODate("2013-05-14T08:36:58.691Z"),
"op" : "query",
"ns" : "ssodatabase.digitalriverorderdetails",
"query" : {
"invoiceId" : "15539232823"
},
"ntoreturn" : 1,
"nscanned" : 1,
"nreturned" : 1,
"responseLength" : 1213,
"millis" : 663,
"client" : "10.100.10.162",
"user" : "admin"
}
{
"ts" : isodate("2013-05-14t09:17:58.911z"),
"op" : "insert",
"ns" : "ssodatabase.tickets",
"millis" : 527,
"client" : "10.100.10.154",
"user" : "admin"
}
{
"ts" : ISODate("2013-05-14T09:20:58.648Z"),
"op" : "insert",
"ns" : "ssodatabase.tickets",
"millis" : 529,
"client" : "10.100.10.153",
"user" : "admin"
}
复制代码 代码示例:
db.system.profile.find(
{
ts : {
$gt : new ISODate("2013-05-09T03:00:00Z") ,
$lt : new ISODate("2013-05-17T09:40:00Z")
}
},
{ user : 1 } -- 只输出用户信息
).sort( { millis : -1 } ) -- 倒序排序
PRIMARY> db.system.profile.find(
... {
... ts : {
... $gt : new ISODate("2013-05-09T03:00:00Z") ,
... $lt : new ISODate("2013-05-17T09:40:00Z")
... }
... },
... { user : 1 }
...).sort( { millis : -1 } )
{ "user" : "admin" }
{ "user" : "admin" }
{ "user" : "admin" }
{ "user" : "admin" }
{ "user" : "admin" }
{ "user" : "admin" }
{ "user" : "admin" }
{ "user" : "admin" }
{ "user" : "admin" }
{ "user" : "admin" }
{ "user" : "admin" }
{ "user" : "admin" }
{ "user" : "admin" }
{ "user" : "admin" }
{ "user" : "admin" }
{ "user" : "admin" }
{ "user" : "admin" }
{ "user" : "admin" }
{ "user" : "admin" }
{ "user" : "admin" }
7.3 带执行时间倒序排序,并且只输出用户信息
复制代码 代码示例:
db.system.profile.find(
{
ts : {
$gt : new ISODate("2013-05-09T03:00:00Z") ,
$lt : new ISODate("2013-05-17T09:40:00Z")
}
}
).sort( { millis : -1 } ) -- 倒序排序
MongoDB 2.5新查询引擎简介 MongoDB 管理工具 Robomongo mongoDB 2.6.5下载,安装及mongoDB基本使用命令介绍 activemq-store-mongodb Windows 7 32位下 MongoDB安装步骤 Sysbench for MongoDB MongoDB 的 ORM框架 MongoMongo MongoDB慢查询监控工具 MongoSpy PHP的mongodb操作类TmongoDB TmongoDB MongoDB 的 GUI 客户端 MonjaDB MongoDB的Java DAO生成器 GuiceyData MongoDB文档筛选和更新工具 MongoVision MongoDB Java Driver MongoDB 管理工具 phpMoAdmin 基于MongoDB的数据分析工具 Cube MongoDB状态监控工具 MongoWatch MongoDB管理控制台 Genghis MongoDB文件存储规范 GridFS MongoDB 的 ORM框架 MJORM python连接mongodb操作数据示例(mongodb数据库配置类)