MongoDBスロークエリ最適化


一、MongoDBスロークエリー(Profiling)レベル説明
0:  ,          ,   0
1:       ,   100  
2:      

1、スロークエリーのオープンと設定①プロファイルの変更(mongo.conf)Profilingのオープン
#     ,200     
profile = 1
slowms = 200

②mongoshell一時的にプロファイルを開く
##     
mongo --host 127.0.0.1:27017 --username    --password    --authenticationDatabase admin

##               
use crm

##  Profiling
PRIMARY> db.getProfilingStatus()          //    :     
{ "was" : 1, "slowms" : 100 }

PRIMARY> db.getProfilingLevel()          //    
1

PRIMARY> db.setProfilingLevel(2)         //    
{ "was" : 1, "slowms" : 100, "ok" : 1 }

PRIMARY> db.setProfilingLevel(1,200)     //       
{ "was" : 2, "slowms" : 100, "ok" : 1 }

2、遅いクエリのサイズを変更する
##  Profiling
PRIMARY> db.setProfilingLevel(0)
{ "was" : 0, "slowms" : 200, "ok" : 1 }

##  system.profile  
PRIMARY> db.system.profile.drop()
true

##      system.profile  
PRIMARY> db.createCollection( "system.profile", { capped: true, size:4000000 } )
{ "ok" : 1 }

##    Profiling
PRIMARY> db.setProfilingLevel(1)
{ "was" : 0, "slowms" : 200, "ok" : 1 }


メモ:Secondarysystem.profileのサイズを変更するには、Secondaryを停止し、独立して実行してから、上記の手順を実行する必要があります.完了したら、レプリカセットへの追加を再起動します.
二、遅い照会(system.profile)説明
PRIMARY> db.system.profile.find().pretty()
{
	"op" : "query",               #    , insert、query、update、remove、getmore、command
	"ns" : "crm.customer",        #     
	"command" : {                 #     
		"find" : "customer",
		"filter" : {
			"stores" : 909,
			"companyId" : 999
		},
		"sort" : {
			"_id" : -1
		},
		"limit" : 100000,
	},
	"cursorid" : NumberLong("8994141675609999540"),
	"keysExamined" : 24221,
	"docsExamined" : 24221,
	"hasSortStage" : true,
	"nreturned" : 101,      #      。  ,profile         (      ),  ntoreturn   1。limit(5)         ,  ntoreturn  5。  ntoreturn  0,              ,           find()         。
    "ntoskip" : 0,     #skip()        
    "nscanned" : 304,  #    
    "keyUpdates" : 0,  #       ,                 ,           key,       key B-   
    "numYield" : 0,    #              
    "lockStats" : {    #   ,R:    ;W:    ;r:        ;w:        
        "timeLockedMicros" : {     # 
            "r" : NumberLong(19467),
            "w" : NumberLong(0)
        },
        "timeAcquiringMicros" : {  #   
            "r" : NumberLong(7),
            "w" : NumberLong(9)
        }
    },
	"ts" : ISODate("2020-11-18T02:40:53.138Z"),    #       
	"client" : "192.168.0.140",                    #  ip    
	"allUsers" : [],
	"user" : ""                                    #  
}

三、日常使用の照会
##     10   
db.system.profile.find().limit(10).sort({ ts : -1 }).pretty()

##       , command   
db.system.profile.find( { op: { $ne : 'command' } } ).pretty()

##      
db.system.profile.find( { ns : 'mydb.test' } ).pretty()

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

##               
db.system.profile.find({
  ts : {
    $gt : new ISODate("2020-11-17T09:00:00Z") ,
    $lt : new ISODate("2020-11-17T09:40:00Z")
  }}).pretty()

#    ,    ,        
db.system.profile.find({
  ts : {
    $gt : new ISODate("2020-11-17T09:00:00Z") ,
    $lt : new ISODate("2020-11-17T09:40:00Z")
  }},
  { user : 0 }
  ).sort( { millis : -1 } )