Mongo 慢SQL查询设置查监控

一、前言
在数据库中,慢查询日志通常是用来进行优化数据库,MySQL中存在慢查询,Mongodb中也是如此。
在Mongo中的慢查询属于Mongo Database Profiler,而且其信息详细。

接下来介绍下Mongo慢查询
二、开启 Profiling 功能
开启并控制Profiling 的方式有两种,
第一种,是直接在启动参数里直接进行设置,启动MongoDB时加上–profile=级别 即可。
第二种是在客户端进行调用。
调用db.setProfilingLevel(级别) 命令来实时配置。
可以通过db.getProfilingLevel()命令来获取当前的Profile级别。

> db.setProfilingLevel(2); 
{
    
    "was" : 0 , "ok" : 1} 
> db.getProfilingLevel()  

上面的级别可以取0,1,2 三个值,他们表示的意义如下:
 0 – 不开启
 1 – 记录慢命令 (默认为>100ms)
 2 – 记录所有命令
Profile 记录在级别1时会记录慢命令,默认为100ms,当然有默认就有设置,其设置方法和级别一样有两种,一种是通过添加–slowms启动参数配置。第二种是调用db.setProfilingLevel时加上第二个参数:

db.setProfilingLevel( level , slowms ) 
db.setProfilingLevel( 1 , 10 );
db.setProfilingLevel( 1 );

1、查询 Profiling 记录

与MySQL的慢查询日志不同,Mongo Profile 记录是直接存在系统db里的,记录位置 system.profile ,所以,我们只要查询这个Collection的记录就可以获取到我们的 Profile 记录了。

> db.system.profile.find() 
{
    
    "ts" : "Thu Jan 29 2009 15:19:32 GMT-0500 (EST)" , "info" : "query test.$cmd ntoreturn:1 reslen:66 nscanned:0 
query: {
    
     profile: 2 } nreturned:1 bytes:50" , "millis" : 0} 
db.system.profile.find( {
    
     info: /test.foo/ } ) 
{
    
    "ts" : "Thu Jan 29 2009 15:19:40 GMT-0500 (EST)" , "info" : "insert test.foo" , "millis" : 0} 
{
    
    "ts" : "Thu Jan 29 2009 15:19:42 GMT-0500 (EST)" , "info" : "insert test.foo" , "millis" : 0} 
{
    
    "ts" : "Thu Jan 29 2009 15:19:45 GMT-0500 (EST)" , "info" : "query test.foo ntoreturn:0 reslen:102 nscanned:2 
query: {
    
    } nreturned:2 bytes:86" , "millis" : 0} 
{
    
    "ts" : "Thu Jan 29 2009 15:21:17 GMT-0500 (EST)" , "info" : "query test.foo ntoreturn:0 reslen:36 nscanned:2 
query: {
    
     $not: {
    
     x: 2 } } nreturned:0 bytes:20" , "millis" : 0} 
{
    
    "ts" : "Thu Jan 29 2009 15:21:27 GMT-0500 (EST)" , "info" : "query test.foo ntoreturn:0 exception bytes:53" , "millis" : 88}

1、列出执行时间长于某一限度(5ms)的 Profile 记录:

> db.system.profile.find( {
    
     millis : {
    
     $gt : 5 } } ) 
{
    
    "ts" : "Thu Jan 29 2009 15:21:27 GMT-0500 (EST)" , "info" : "query test.foo ntoreturn:0 exception bytes:53" , "millis" : 88}

2、查看最新的 Profile 记录:

db.system.profile.find().sort({
    
    $natural:-1})

Mongo Shell 还提供了一个比较简洁的命令show profile,可列出最近5条执行时间超过1ms的 Profile 记录。

2、开启慢日志

1.查看mongodb慢日志是否开起

use dbname;
db.getProfilingStatus();

发现没有开户慢日志
2.开启慢日志,设置超过100毫秒的操作为慢操作

db.setProfilingLevel(1,100); 

3.查看慢日志内容

db.system.profile.find().sort({$natural:-1})
得到50个比较慢的操作日志.

3、查看当前操作

db.currentOp(true);

主要有以下信息:

client – 请求是由哪个客户端发起的
opid – 操作的opid,有需要的话,可以通过 db.killOp(opid) 杀死操作
secs_running/microsecs_running – 请求运行的时间,如果这个值特别大就非常值得注意
query/ns: 对集合进行的具体操作
lock*:锁相关参数

4、慢请求分析 – 全表扫描 COLLSCAN
如果在日志中看到关键字 COLLSCAN,说明该查询在进行全表扫描,通常这就是 CPU 异常飙高的主要原因。

4.1. 查看扫描文档数
system.profile 里 docsExamined 的值显示了本次查询的扫描文档数。

4.2. 解决办法 – 添加索引
最好针对查询语句建立索引:

db.col.createIndex({
    
    “title”:1})

我们也可以在添加索引时增加传入可选参数,例如,在生产环境我们通常不希望索引添加的操作阻塞其他数据库操作,这时就需要务必添加 background 参数:

db.col.createIndex({
    
    “title”:1}, {
    
    ‘background’, true})

MongoDB 的 慢查询
MongoDB 的 慢查询记录储存在 system.profile 里,默认情况下是关闭的,我们可以在数据库级别上或者是节点级别上配置。

开启 Profiling 功能
有两种方式可以控制 Profiling 的开关和级别,第一种是直接在启动参数里直接进行设置。

启动MongoDB时加上–profile=级别 即可。

也可以在客户端调用db.setProfilingLevel(级别) 命令来实时配置。可以通过db.getProfilingLevel()命令来获取当前的Profile级别。

use dbName;
#如果db有密码
#db.auth('name','passwd');
#记录所有db的命令,默认记录的超时时间是100ms
db.setProfilingLevel(2); 
#或者正在开启慢查询的时候指定记录信息的超时时间,下面deo是记录超过10ms的语句
#db.setProfilingLevel( 1 , 10 );
{
    
    "was" : 0 , "ok" : 1} 
db.getProfilingLevel()

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

0 : 不开启
1 : 记录慢命令 (默认为>100ms)
2 : 记录所有命令
查看慢sql信息
列出执行时间长于某一限度(5ms)的 Profile 记录:

db.system.profile.find( {
    
     millis : {
    
     $gt : 5 } } ) 
{
    
    "ts" : "Thu Jan 29 2009 15:21:27 GMT-0500 (EST)" , "info" : "query test.foo ntoreturn:0 exception bytes:53" , "millis" : 88}

查看最近3条 慢请求,{$natrual: -1} 代表按插入顺序逆序

db.system.profile.find().sort({
    
    $natrual: -1}).limit(3)

查看最新的 Profile 记录:

db.system.profile.find().sort({
    
    $natural:-1}).limit(1)
 {
    
     "ts" : ISODate("2012-05-20T16:50:36.321Z"), "info" : "query test.system.profile reslen:1219
nscanned:8  \nquery: {
    
     query: {
    
    }, orderby: {
    
     $natural: -1.0 } }  nreturned:8 bytes:1203", "millis" :
0 }

3个字段的意义:

ts:时间戳
info:具体的操作
millis:操作所花时间,毫秒
explain 功能查看mongo对查询时使用索引后的优化结果
demo
通过查询 age < 10 的数据来观察索引的时候情况

db.tableName.find({
    
    age:{
    
    $lt:10}}).explain();

MongoDB使用 createIndex() 方法来创建索引
语法

db.tableName.createIndex(keys, options)

demo

db.tableName.createIndex({
    
    "title":1})

语法中 Key 值为你要创建的索引字段,1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可。

createIndex() 方法中你也可以设置使用多个字段创建索引(关系型数据库中称作复合索引)。

db.tableName.createIndex({
    
    "title":1,"description":-1})

mongo索引相关限制

集合中索引不能超过64个
索引名的长度不能超过128个字符
一个复合索引最多可以有31个字段
查看mongo集合索引
查看集合索引

db.tableName.getIndexes()

查看集合索引大小

db.tableName.totalIndexSize()

删除mongo集合指定索引
删除指定索引

db.tableName.dropIndex("索引名称")

删除集合所有索引

db.col.dropIndexes()

查看最后几条数据
可以从此查询中看到最近添加的N条记录(从最近到最近):

db.collection.find().skip(db.collection.count() - N)

sort() , limit() , skip()语法
sort按照某个字段排序,limit就是limit,skip就是在结果集中从前往后跳过几条记录

db.collections.find().sort({
    
    key:value}).limit(int value).skip(some int value);

猜你喜欢

转载自blog.csdn.net/qq_41588098/article/details/130199986
今日推荐