第三部分 性能
索引管理
性能优化
性能监控
索引
MongoDB提供了多样性的索引支持,索引信息被保存在system.indexes中,MongoDB中_id字段在创建的时候,默认已经建立了索引,这个索引比较特殊,并且不可删除,不过Capped Collection例外
1 建立过引(普通索引)
函数: ensureIndex()
例子: name上建立索引 1(升序) -1(降序)
db.persons.ensureIndex({name:1});
当系统已经有大量数据时,创建索引非常耗时,需要在后台执行,只需要指定background:true即可
db.c3.ensureIndex({age:1},{background:true});
db.c1.find({name:"user5"}).explain(); //查询的详细信息列出来
db.c1.getIndexKyes(); //所有索引的字段
db.c1.getIndexes(); //所有索引的相关信息
2 唯一索引
只需要在ensureIndex命令中提定"uniqure:true"即可创建唯一索引,
如果表中有二条一样的数据,那么建立不了唯一索引
这个唯一索引没弄成功????????????
妈的,试了两次还是不行,真不知道是好里不对,按例子来的也不对
3 查看索引
查看索引使用命令getIndexes()
上例显示出来的一共有二个索引,其中_id是创建表的时候自动创建的索引,此索引是不能够了删除的
4 删除索引
dropIndex();
db.c3.dropIndex(); //删除所有索引
db.c3.dropIndex({age:1}); //删除指定索引
性能优化
explain执行计划
MongoDB提供了一个explain命令让我们获知系统如何处理查询请求,利用explain命令我们可以很好地观察系统如何使用索引来加快检索,同时可以针对性优化索引
优化器profile
MongoDB Database Profiler是一种查询日志功能,可以作为我们优化数据库的依据
开始Profiling功能
有两种方式可以控制Profiling的开关和级别
启动MongoDB时加上-profile=级别即可
在客户端调用db.setProfilingLevel(级别)命令来实时配置
Profiler信息保存在system.profile中,我们可以通过db.getProfilingLevel()命令来获取当前的Profile级别
具体操作
db.setProfilingLevel(2);
上面的profile的级别可以取0 1 2 三个值,它们的表示
0 不开启
1 记录慢命令
2 记录所有命令
Profile在级别1时会记录慢命令,上面默认值为100ms,在默认就有设置,其设置方法和级另有两种方法:
一种是通添加--slowms启动参数配置,
db.setProfilingLevel时加上第二个参数
db.setProfilingLevel(1,10);
那么这个慢的定义是什么
可以理解比较耗时的命令
如果一个查询耗时10毫秒,就会被记录下来
优化方案1: 创建索引
在查询条件的字段上,或者排序条件的字段上创建索引,可以显著提高执行效率
db.posts.ensureIndex({name:1});
方案2: 限定返顺结果条数
使用limit()限定返回结果集的大小,可以减少database server的资源消耗,可以减少网络传输数据量
db.posts.find().sort({ts:1}).limit(10);
方案3: 查询使用的字段,不查询所有字段
db.posts.find({},{t1:1,title:1,author:1}).sort({ts:-1}).limit(10);
方案4: 采用cappedCollection
capped Collection比普通Collections的读写效率高
方案5: 采用Profiling
Profiling功能肯定是会影响次效率,但是不太严重,原因是他使用的是system.profile来记录system.profile是一个capped collection这种collection在操作上有一些限制和特点,但是效率更高
性能监控
通过对数据库的性能监控,能够更好的了解数据库的工作状态,从而进行优化