下面我将详细讲解关于MongoDB的慢日志查询(即profile)的完整攻略:
MongoDB的慢日志查询(profile)
什么是慢日志查询(profile)
MongoDB的慢日志查询是指将MongoDB数据库中执行时间较长的操作记录下来,并保存到慢查询日志中。MongoDB通过慢日志查询,可以掌握响应时间较慢的查询,以及可能需要优化的操作。慢日志查询功能可以通过MongoDB提供的命令进行开启和关闭。
如何开启慢日志查询
想开启数据库的慢日志查询,可以按照以下步骤操作:
-
登录MongoDB数据库,切换至admin库;
-
执行如下命令:
db.setProfilingLevel(1, {slowms: 200})
,其中slowms选项是指超时时间阈值,这里我们选取200ms作为慢查询日志的记录阈值,即执行时间超过200ms的操作将被记录在日志中。修改slowms的值可以根据实际情况进行调整。
如何查看慢日志查询结果
慢日志查询会将查询结果保存在MongoDB的system.profile集合中,可以通过以下步骤查看慢日志查询结果:
-
登录MongoDB数据库,切换至admin库;
-
执行如下命令:
db.system.profile.find().limit(10).pretty()
,表示查看system.profile集合中的前10条记录,效果如下:
{
"op" : "query",
"ns" : "test.books",
"command" : {
"find" : "books",
"filter" : {
},
"sort" : {
"_id" : -1
},
"limit" : 10,
"$db" : "test"
},
"keysExamined" : 0,
"docsExamined" : 10,
"hasSortStage" : true,
"cursorExhausted" : true,
"numYield" : 0,
"nreturned" : 10,
"responseLength" : 3394,
"protocol" : "op_query",
"millis" : 220,
"planSummary" : "COLLSCAN",
"execStats" : {
"stage" : "FETCH",
"nReturned" : 10,
"executionTimeMillisEstimate" : 0,
"works" : 11,
"advanced" : 10,
"needTime" : 0,
"needYield" : 0,
"saveState" : 0,
"restoreState" : 0,
"isEOF" : 1,
"invalidates" : 0,
"docsExamined" : 10,
"alreadyHasObj" : 0,
"inputStage" : {
"stage" : "COLLSCAN",
"nReturned" : 10,
"executionTimeMillisEstimate" : 0,
"works" : 11,
"advanced" : 10,
"needTime" : 0,
"needYield" : 0,
"saveState" : 0,
"restoreState" : 0,
"isEOF" : 1,
"invalidates" : 0,
"direction" : "forward",
"docsExamined" : 10
}
},
"ts" : ISODate("2022-11-03T09:18:19.268Z"),
"client" : "127.0.0.1",
"allUsers" : [],
"user" : ""
}
其中每一条记录都包含了执行查询的相关信息,如查询语句、执行时间、查询结果等。通过观察执行时间,可以快速定位响应时间较慢的操作,以便进行优化。
示例说明
示例1:查询某个集合中的记录,超时时间为300ms
执行以下命令,即可开启集合books的慢日志查询,并设置超时时间阈值为300ms。
use test;
db.setProfilingLevel(1, {slowms: 300})
当查询books集合的语句执行时间超过300ms时,MongoDB会将此次查询记录在慢查询日志中,我们可以通过以下命令查看慢查询日志的记录:
db.system.profile.find().limit(10).pretty()
示例2:开启全局性的慢日志查询,并将记录结果输出到指定文件中
执行以下命令,即可开启全局性的慢日志查询,并将记录结果输出到mongo.log文件中。
use admin;
db.setProfilingLevel(2)
db.setLogLevel(1, "mongo.log");
说明:通过setLogLevel()函数指定了输出日志的级别是“mongo.log”,这意味着只有查询结果被记录在了慢查询日志中,而其他警告信息和错误信息被记录在了mongo.log文件中。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入讲解MongoDB的慢日志查询(profile) - Python技术站