MongoDB:索引与性能
2016-02-18 17:44
597 查看
一、索引
MongoDB 提供了多样性的索引支持索引信息被保存在 system.indexes 中且默认总是为 _id 创建索引。1、基础索引
在字段 age 上创建索引 1 (升序); -1 (降序)上例显示出来的一共有2个索引其中_id是创建表的时候自动创建的索引此索引是不能够删除的。
当系统已有大量数据时创建索引就是个非常耗时的活我们可以在后台执行只需指定“backgroud:true”即可。
db.stu.ensureIndex({"age":1},{"background":true})
2、文档索引
索引可以任何类型的字段甚至文档db.stu.insert({_id:3,name:'user2',age:12,addr:{city:'beijing',state:"BJ"}}) db.stu.insert({_id:4,name:'user2',age:12,addr:{city:'shanghai',state:"SH"}}) db.stu.ensureIndex({addr:1})
下面这个查询将会用到我们刚刚建立的索引
db.stu.find({addr:{city:'beijing',state:'BJ'}}) { "_id" : 3, "name" : "user2", "age" : 12, "addr" : { "city" : "beijing", "state" : "BJ" } }
而下面的查询却不能查到结果
db.stu.find({addr:{state:'BJ',city:'beijing'}})
如图
3、组合索引
跟其它数据库产品一样 MongoDB 也是有组合索引的,下面我们将在 addr.city 和 addr.state 上建立组合索引。当创建组合索引时,字段后面的 1 表示升序,-1 表示降序。是用 1 还是用 -1, 主要是跟排序的时候或指定范围内查询的时候有关的。db.stu.ensureIndex({'addr.city':1,'addr.state':1})
下面的查询都用到了这个索引
4、唯一索引
只需在ensureIndex命令中指定 ”unique:true“ 即可创建唯一索引。db.t4.ensureIndex({firstname: 1, lastname: 1}, {unique: true});
当建唯一索引时如果表中有2条一模一模的数据就建立不了唯一索引。
5、强制使用索引
hint命令可以强制使用某个索引。db.stu.ensureIndex({name:1,age:1})
则下面不能使用索引
使用hint强制使用索引
6、删除索引
#删除t3 表中的所有索引 db.t3.dropIndexes() #删除t4 表中的firstname 索引 db.t4.dropIndex({firstname: 1})
二、explain 执行计划
MongoDB提供了一个explain命令让我们获知系统如何处理查询请求。利用explain命令,我们可以很好地观察系统如何使用索引来加快检索同时可以针对性优化索引。几个关键的字段说明:
字段 | 说明 |
---|---|
cursor | 返回游标类型(BasicCursor或BtreeCursor) |
nscanned | 被扫描的文档数量 |
n | 返回的文档数量 |
millis | 耗时(毫秒) |
indexBounds | 所使用的索引 |
三、优化器 profile
在MySQL中慢查询日志是经常作为我们优化数据库的依据那在MongoDB中是否有类似的功能呢?答案是肯定的那就是MongoDBDatabaseProfiler。所以MongoDB不仅有而且还有一些比MySQL的SlowQueryLog更详细的信息。1、开启 Profilling 功能
有两种方式可以控制 Profiling 的开关和级别第一种是直接在启动参数里直接进行设置。启动 MongoDB 时加上 -profile=级别 即可。
在客户端调用 db.setProfilingLevel(级别) 命令来实时配置 Profiler。
信息保存在 system.profile 中。我们可以通过 db.getProfilingLevel() 命令来获取当前的 Profile 级别。
profile的级别可以取012三个值他们表示的意义如下:
0 – 不开启 1 – 记录慢命令(默认为>100ms) 2 – 记录所有命令
Profile记录在级别1时会记录慢命令那么这个慢的定义是什么?
上面我们说到其默认为100ms,当然有默认就有设置其设置方法。
通过添加 -slowms 启动参数配置。
调用db.setProfilingLevel时加上第二个参数
db.setProfilingLevel(1,10);
2、查询 Profiling 记录
与MySQL的慢查询日志不同 MongoDBProfile。记录是直接存在系统 db 里的记录位置 system.profile,所以我们只要查询这个Collection的记录就可以获取到我们的Profile记录了。列出执行时间长于某一限度(5ms)的Profile记录db.system.profile.find( { millis : { $gt : 5 } } )
{ "op": "command", "ns": "test.$cmd", "command": { "count": "orders", "query": {}, "fields": {} }, "ntoreturn": 1, "keyUpdates": 0, "numYield": 0, "lockStats": { "timeLockedMicros": { "r": NumberLong(11494), "w": NumberLong(0) }, "timeAcquiringMicros": { "r": NumberLong(4), "w": NumberLong(5) } }, "responseLength": 48, "millis": 11, "ts": ISODate("2013-11-16T13:52:38.391Z"), "client": "127.0.0.1", "allUsers": [], "user": "" }
查询最新的一条可以使用如下命令
db.system.profile.find().sort({$natural:-1}).limit(1)
MongoDBShell 还提供了一个比较简洁的命令 showprofile 可列出最近5条执行时间超过 1ms 的Profile记录。Profiling功能肯定是会影响效率的但是不太严重,原因是他使用的是system.profile来记录,而system.profile是一个 capped collection 这种collection在操作上有一些限制和特点,但是效率更高。
转载自 /article/4255898.html
相关文章推荐
- windows下log4j日志存储到mongodb下
- [翻译]mongodb日志分析工具mtools之mplotqueries
- ivqBlog 开源博客 (angularjs + express + mongodb)
- php 操作mongodb
- MongoDB操作
- MongoDB(三)mongoDB下载和安装
- 利用log4j+mongodb实现分布式系统中日志统一管理
- MongoDB从不同角度的分析(顶)
- PHP之mongodb学习
- mongodb 配置项详解
- MongoDB概念解析
- mongodb的使用
- Mongodb嵌套文档的修改-利用数组修改器更新数据
- MongoDB是?
- Ubuntu 14.04 安装MongoDB社区版
- 基于ssdb和mongodb的feed服务架构
- zabbix如何监控mongodb
- mongodb 3.2版本基本管理
- MongoDB索引使用
- windows下MongoDB的安装以及php的扩展