zoukankan      html  css  js  c++  java
  • mongodb--Profiling慢查询详解

    官方查询地址:https://docs.mongodb.com/v3.2/tutorial/manage-the-database-profiler/

    在很多情况下,DBA都要对数据库的性能进行分析处理,找出降低性能的根源

    而Mongo就有一种分析工具来检测并追踪影响性能的慢查询---Profile

    有两种方式可以控制Profiling的开关和级别,

    第一种是直接在启动参数中进行设置,如下:

    如果想要全局开启Profiling,则可以在mongod启动时加上参数

    mongod --profile 1 --slowms100         # 1表示追踪级别,100表示慢查询判定时间(ms)

    如果是配置文件中开启的话,配置如下:
    [javascript] view plain copy

    1. operationProfiling:  
    2.      slowOpThresholdMs: 100  
    3.      mode: slowOp  


    第二种是在mongo shell进行实时配置,命令如下:

    > db.setProfilingLevel(1,200)          ---1表示level,200表示慢查询时间(ms),也可以省略时间设置

    { "was" : 1, "slowms" : 100, "ok" : 1 }     ---100表示之前的慢查询时间设定值

    > db.getProfilingStatus()               ---查询当前慢查询的状态信息

    { "was" : 1, "slowms" : 200 }          ---was后的值表示级别

    > db.getProfilingLevel()               ---只查询Profiling级别可用此命令

    1

    级别可以取0,1,2 三个值,他们表示的意义如下: 

      0 – 不开启

      1 – 记录慢命令 (默认为>100ms)

      2 – 记录所有命令

    Mongo Profile慢查询记录直接记录在db中,记录位置是当前开启Profile功能的库下的system.profile集合中,所以只需要直接查询这个集合就行

    例:

         查询执行时间大于200ms的Profile记录:

    > db.system.profile.find( { millis : { $gt : 5 } } )

    查看最近的10条记录

    >db.system.profile.find().limit(10).sort( { ts : -1 } ).pretty()

         查看关于某个collection的相关慢查询操作:

    >db.system.profile.find({ns:'mydb.table1'}).pretty()

    show profile命令

    此命令查询执行时间超过1ms的最近5条记录

    对于Profile的相关信息解释:

    op:操作的类型,比如:insert,query,command,remove...

    ns:被查询目标的命名空间,一般是数据库名和collection名的组合

    query:查询的具体语句,如果是insert操作,则会是insert的语句

    command:如果操作是一个command,则command语句记录在此

    keysExamined:以前是nscanned,3.2版本之后改为keysExamined,表示执行此次操作所扫描的索引键记录数

    updateobj:如果操作是一个update,则update语句记录在此

    ndeleted:此次操作删除的文档数

    ninserted: 此次操作插入的文档数

    nModified:此次操作的update的文档数

    writeConflicts:如果一个update语句正在操作一个文档,而另一个update同时进行操作此文档,从而造成的冲突数量

    locks:此次操作产生锁的相关信息

    nreturned:此次操作返回的文档数

    responseLength:操作结果集的大小,

    moved:表明本次update是否移动了硬盘上的数据,如果新记录比原记录短,通常不会移动当前记录,如果新记录比原记录长,那么可能会移动记录到其它位置,这时候会导致相关索引的更新.磁盘操作更多,加上索引更新,会使得这样的操作比较慢.(不过这个选在仅针对引擎是MMAPv1)

    MongoDB 查询优化

         如果keysExamined (扫描索引建的记录数)远大于nreturned(返回结果的记录数)的话,那么我们就要考虑通过加索引来优化记录定位了。

         responseLength 如果过大,那么说明我们返回的结果集太大了,可能会影响性能,这时请查看find函数的第二个参数是否只写上了你需要的属性名(限制于仅需要查询的字段)。(类似 于MySQL中不要总是select *)

         对于创建索引的建议是:如果很少读,那么尽量不要添加索引,因为索引越多,写操作会越慢。如果读量很大,那么创建索引还是比较划算的。

    Profiler 的效率

      Profiling 功能肯定是会影响效率的,但是不太严重,原因是他使用的是system.profile 来记录,而system.profile 是一个capped collection 这种collection 在操作上有一些限制和特点,但是效率更高

    也可以对system.profile的size进行设置,具体设置如下:

    [python] view plain copy

    1. db.setProfilingLevel(0)  
    2.   
    3. db.system.profile.drop()  
    4.   
    5. db.createCollection( "system.profile", { capped: true, size:4000000 } )  
    6.   
    7. db.setProfilingLevel(1)  

    --------------------- 本文来自 random-walk 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/asdfsadfasdfsa/article/details/65633588?utm_source=copy

  • 相关阅读:
    黄聪:自己写的C#对Access操作的数据回滚程序
    黄聪:c# 操作配置文件Properties.Settings
    黄聪:C#类似MSN的右下角弹出窗体
    黄聪:C#尽量使用接口来编程
    黄聪:C#中PictureBox异步加载图片
    黄聪:C# 窗体边框阴影效果
    黄聪:C#安装程序中打包MSDE的八个步骤
    黄聪:c#水晶报表的进一步功能和使用
    黄聪:C# 窗体拖拽功能
    黄聪:C# 日期格式
  • 原文地址:https://www.cnblogs.com/andy6/p/9705906.html
Copyright © 2011-2022 走看看