---sMongodb性能优化
1.explain
db.t2.find({age:{$gt:25}}).explain();
执行计划中重要的属性
cursor:返回的游标的类型
nscanned:被扫描的文档数量
n:返回的文档的数量
millis:耗时(毫秒)
indexBounds所使用的索引
2.看损耗profile
开启profiling功能
启动Mongodb时加上-profile=级别即可
客户端调用db.setProfilingLevel(级别)
profiler信息保存在system.profile中 可以通过db.getProfilingLevel()来获取
当前的profile级别。
profile级别在Mongodb中有三个 分别是0,1,2
0--->不开启
1--->记录慢命令(默认执行时间>100ms)
db.setProfilingLevel(1,slowms)
2--->记录所有命令
查看db.system.profile.find();
db.system.profile.find({mills:{$gt:5}});
重要的属性:
ts :该命令何时执行的
info:本命令的详细信息
reslen:返回的结果集的大小
nscanned:本次查询扫描的记录数
nreturned:实际返回的结果集
millis:该命令执行的消耗时间,单位毫秒
3.常用的性能优化手段
如果nscanned(扫描的记录数)远远大于了nreturned(返回的结果集)的话,
那么我们就要考虑通过索引来优化记录定位了。
reslen如果过大,说明返回的结果集过大,IO就大,过滤条件时候要处理,限定结果是否要处理
索引优化的建议:如果很少读,那么不要加索引,索引越多,写越慢。索引适合读多写少的场景。
建议1:在频繁作为查询条件且修改较少的属性上创建索引。
提供检索速度减低IO
作为排序的属性要创建索引
有索引列,就已经按照索引列排好了序,不需要进行排序运算了。
降低了CPU
建议2: 每次查询应该限定返回结果的条数
降低的主要是IO
建议3:只返回自己需要的属性。而不查询所有字段。
建议4:有些情况下采用capped collection
capped collection 本身比普通collection的读写效率要高。
固定大小 预先创建,并设置大小
可以insert ,update 不能delete,只能drop整个collection
默认是基于insert 的次序排序的。
FIFO
建议5:可以使用存储过程来降低IO操作
建议6: 可以强制使用索引hint
建议7: 采用profiling
profiling功能肯定会影响效率,但是不太严重。
使用system.profile来记录,其本身是capped collection
4.性能监控
主要利用Mongodb提供的工具Mongostat
查看某运行中的Mongodb的实例统计信息
直接mongostat--->看到了统计信息
insert 每秒插入量
query 每秒的查询量
update 每秒的修改量
delete 每秒删除的量
locked:锁定量
qr/qw :客户端查询排队的长度(读|写)
ar/aw:活跃客户端量(读|写)
conn:连接数。
客户端可以通过调用db.serverStatus()来查看
注意一下其中重要的内容
db.stats();当前数据库的一些信息