Mongodb性能优化

---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();当前数据库的一些信息

 

 

你可能感兴趣的:(MongoDB,性能优化,mongodb)