mongodb索引

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("索引名") 


你可能感兴趣的:(mongodb索引)