mongodb
http://www.cnblogs.com/Joans/p/3729914.html
1. 查询指定数据库统计信息
use owl
db.stats()
db.chatMsg.count() 查询集合中文档总数
> db.chatMsg.stats() 查询集合chatMsg统计信息
{
"ns" : "owl2.chatMsg", 集合的名称
"count" : 162310, 集合中文档总数
"size" : 44606530, 数据大小,不包括索引
"avgObjSize" : 274, 平均对象占用空间大小
"storageSize" : 14237696, 给整个集合分配的存储空间,当删除集合中的文档时,这个值不会降低
"capped" : false,
"nindexes" : 3, 索引个数,每个集合至少有一个 _id 索引
"totalIndexSize" : 4820992, 所有索引大小总和
"indexSizes" : { 列出集合的所有索引字段,以及索引大小
"_id_" : 2531328,
"msgId" : 1703936,
"assetId" : 585728
},
"ok" : 1
2. 查询指定数据库包含的集合名称列表
db.getCollectionNames()
3. db 查看当前选择的数据库
4. 查询一条记录 findOne()
eg:
> db.user.findOne()
{ "_id" : ObjectId("5601ff8ded2afab4c1e7c283"), "name" : "tom" }
db.chatMsg.find().limit(5) 查看前5条数据
5. 删除 remove()
db.user.remove({'name':'tom'}) 删除tom
6. 索引
a 创建索引
可以使用集合的ensureIndex(keypattern[,options])方法,示例如下所示:
> use pagedb
switched to db pagedb
> db.page.ensureIndex({'title':1, 'url':-1})
> db.system.indexes.find()
{ "name" : "_id_", "ns" : "pagedb.page", "key" : { "_id" : 1 }, "v" : 0 }
{ "name" : "_id_", "ns" : "pagedb.system.users", "key" : { "_id" : 1 }, "v" : 0}
上述,ensureIndex方法参数中,数字1表示升序,-1表示降序。
使用db.system.indexes.find()可以查询全部索引
b. 查询索引
我们为集合建立的索引,那么可以通过集合的getIndexes()方法实现查询,示例如下所示:
> db.page.getIndexes()
[
{
"name" : "_id_",
"ns" : "pagedb.page",
"key" : {
"_id" : 1
},
"v" : 0
},
{
"_id" : ObjectId("4ef977633c1fc4613425accd"),
"ns" : "pagedb.page",
"key" : {
"title" : 1,
"url" : -1
},
"name" : "title_1_url_-1",
"v" : 0
}
]
c. 删除索引
删除索引给出了两个方法:
1 db.mycoll.dropIndex(name)
2 db.mycoll.dropIndexes()
第一个通过指定索引名称,第二个删除指定集合的全部索引。
d. 索引重建
可以通过集合的reIndex()方法进行索引的重建,示例如下所示:
use fragment
db.baseSe.count()
统计结果,如下所示:
1 > use fragment
2 switched to db fragment
3 > db.baseSe.count()
4 36749
上述统计了数据库fragment的baseSe集合中记录数。
8. db.currentOp()获取当前正在执行的操作。
例---------------------------------------------
{
"inprog" : [
{
"desc" : "conn1834",
"threadId" : "0x7ba11e0",
"connectionId" : 1834,
"opid" : 294699,
"..............
-----------------------------------------------
db.killOp("394699") 结束OpID 为394699的操作
-------------------------------------------------------------------------------------------------------------------------------------------------------
性能分析
http://www.cnblogs.com/DxSoft/archive/2010/10/21/1857357.html
http://www.cnblogs.com/zhoujinyi/p/3566773.html
9. 设置当前数据库Profiling级别:
db.setProfilingLevel(n);
n:
0 - 关闭,不收集任何数据。生产环境关闭,对性能有很大影响
1 - 收集慢查询数据,默认是100毫秒
2 - 收集所有数据
db.setProfilingLevel(1,50) 打开慢查询日志,慢查询时间为50ms
查看日志分析级别和慢查询时间
> db.getProfilingStatus()
{ "was" : 1, "slowms" : 50 }
查看日志分析级别:
db.getProfilingLevel();
10 修改 慢查询日志 的大小
# 关闭Profiling
> db.setProfilingLevel(0)
{ "was" : 0, "slowms" : 50, "ok" : 1 }
#删除system.profile集合
> db.system.profile.drop()
true
#创建一个新的system.profile集合
> db.createCollection( "system.profile", { capped: true, size:4000000 } )
{ "ok" : 1 }
#重新开启Profiling
> db.setProfilingLevel(1)
{ "was" : 0, "slowms" : 200, "ok" : 1 }
11 慢查询(system.profile)说明
官网https://docs.mongodb.org/manual/reference/database-profiler/
1). 参数含义
> db.system.profile.find().sort({millis:-1}).limit(1).pretty()
{
"op" : "query", #操作类型,有insert、query、update、remove、getmore、command
"ns" : "owl2.chatMsg", #操作的集合
"query" : { #查询语句
"$query" : {
"assetId" : "84295"
},
"$orderby" : {
"msgId" : -1
}
},
"ntoreturn" : 20, #返回的记录数
"ntoskip" : 0, #skip()方法指定的跳跃数
"nscanned" : 163354, #扫描数量 对于定义了索引的查询:nscanned体现了Mongo扫描字段索引的条数,而nscannedObjects则为最
#终结果中查询过的文档数目。n则表示了返回文档的数目。nscannedObjects至少包含了所有的返回文档,即使
#Mongo明确了可以通过查看绝对匹配文件的索引。因此可以得出nscanned >= nscannedObjects >= n对于简单
#查询你可能期望3个数字是相等的。这意味着你做出了MongoDB使用的完美索引。
"nscannedObjects" : 163354, #最终结果中查询过的文档数目
"keyUpdates" : 0, #索引更新的数量,改变一个索引键带有一个小的性能开销,因为数据库必须删除旧的key,并插入一个新的key到B-树索引
"writeConflicts" : 0,
"numYield" : 1276,
"locks" : { #锁信息 Global:全局锁 Database:数据库锁 Collection:集合锁 Metadata:元数据锁 oplog:oplog锁
"Global" : { # R represents Shared (S) lock. R代表共享锁 锁介绍http://bbs.csdn.net/topics/80107248
"acquireCount" : { # W represents Exclusive (X) W代表独占锁
"r" : NumberLong(2554) # r represents Intent Shared (IS) lock. r代表意向共享锁
} # w represents Intent Exclusive (IX) lock w代表意向排它锁
}, #
"Database" : { #lock.locks.timeAcquiringMicros 锁等待
"acquireCount" : {
"r" : NumberLong(1277)
}
},
"Collection" : { #集合锁
"acquireCount" : {
"r" : NumberLong(1277)
}
}
},
"nreturned" : 12, #返回的数量
"responseLength" : 2996, #结果字节长度
"millis" : 568, #消耗的时间(毫秒)
"execStats" : {
"stage" : "CACHED_PLAN",
"nReturned" : 12,
"executionTimeMillisEstimate" : 520, #估算执行时间
"works" : 163355,
"advanced" : 12,
"needTime" : 163342,
"needFetch" : 0,
"saveState" : 1276,
"restoreState" : 1276,
"isEOF" : 1,
"invalidates" : 0,
"inputStage" : {
"stage" : "FETCH",
"filter" : {
"assetId" : {
"$eq" : "84295"
}
},
"ts" : ISODate("2015-12-13T09:25:15.500Z"),
"client" : "10.172.194.67",
"allUsers" : [ ],
"user" : ""
}
除上面外还有:
scanAndOrder:
scanAndOrder是一个布尔值,是True当一个查询不能使用的文件的顺序在索引中的排序返回结果:MongoDB中必须将其接收到的文件从一个游标后的文件进行排序。
如果scanAndOrder是False,MongoDB的可使用这些文件的顺序索引返回排序的结果。即:True:文档进行排序,False:使用索引。
moved
更新操作在磁盘上移动一个或多个文件到新的位置。表明本次update是否移动了硬盘上的数据,如果新记录比原记录短,通常不会移动当前记录,如果新记录比原记录长,那么可能会移动记录到其它位置,这时候会导致相关索引的更新.磁盘操作更多,加上索引
更新,会使得这样的操作比较慢.
nmoved:
文件在磁盘上操作。
nupdated:
更新文档的数目
----------------------------------------------------------------------------------------------------------------------------------
getmore是一个getmore 操作,getmore通常发生在结果集比较大的查询时,第一个query返回了部分结果,后续的结果是通过getmore来获取的。
如果nscanned(扫描的记录数)远大于nreturned(返回结果的记录数)的话,要考虑通过加索引来优化记录定位了。responseLength 如果过大,说明返回的结果集太大了,这时要看是否只需要必要的字段。
----------------------------------------------------------------------------------------------------------------------------------
2)日常使用的查询
数据库的日志分析数据一般存放在当前数据库的 system.profile 集合中
#返回最近的10条记录
db.system.profile.find().limit(10).sort({ ts : -1 }).pretty()
#查看耗时最多的查询
db.system.profile.find().sort({millis:-1}).limit(1).pretty()
查看集合owl2.chatMsg的分析数据
db.system.profile.find({ns:'owl2.chatMsg'}).pretty()
查看执行时间大于100毫秒的执行操作,并倒序排列,并取前5行 pretty()格式化输出
db.system.profile.find({millis:{$gt:100}}).sort({owlid:-1}).limit(5).pretty();
#返回大于5毫秒慢的操作
db.system.profile.find({millis:{$gt:5}}).pretty()
#从一个特定的时间范围内返回信息
db.system.profile.find(
{
ts : {
$gt : new ISODate("2012-12-09T03:00:00Z") ,
$lt : new ISODate("2012-12-09T03:40:00Z")
}
}
).pretty()
#特定时间,限制用户,按照消耗时间排序
db.system.profile.find(
{
ts : {
$gt : new ISODate("2011-07-12T03:00:00Z") ,
$lt : new ISODate("2011-07-12T03:40:00Z")
}
},
{ user : 0 }
).sort( { millis : -1 } )
----------------------------------------------------------------------------------------------------
12 索引
http://www.cnblogs.com/nixi8/p/4843317.html
http://www.csdn.net/article/2012-11-09/2811690-optimizing-mongo
http://blog.csdn.net/huwei2003/article/details/47256295
Mongodb提供了一个explain命令,用来查看查询的过程,以便进行性能优化。
> db.chatMsg.find({"assetId" : "84424"}).explain()
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "owl2.chatMsg",
"indexFilterSet" : false,
"parsedQuery" : {
"assetId" : {
"$eq" : "84424"
}
},
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"assetId" : 1
},
"indexName" : "assetId",
"isMultiKey" : false,
"direction" : "forward",
"indexBounds" : {
"assetId" : [
"[\"84424\", \"84424\"]"
]
}
}
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "owl1",
"port" : 27017,
"version" : "3.0.4",
"gitVersion" : "0481c958daeb2969800511e7475dc66986fa9ed5"
},
"ok" : 1
}
查看集合索引
> db.chatMsg.getIndexes()
例 执行时间550ms
db.chatMsg.find({"assetId" : "49654"}).sort({msgId:-1})
添加联合索引
db.chatMsg.ensureIndex({assetId:1, msgId:1})
后台添加 "background":true
db.test.ensureIndex({"username":1},{"background":true})
6.删除索引
删除chatMsg集合中的所有索引
db.t3.dropIndexes()
删除chatMsg集合中的firstname 索引
db.chatMsg.dropIndex({assetId:1,msgId:1})
删除指定名字的索引
db.t4.dropIndexes("索引名")