任务描述
本关任务:完成慢查询设置并自行分析慢查询结果。
相关知识
为了完成本关任务,你需要掌握: 1.如何进行慢查询分析; 2.如何进行性能分析; 3.常用的慢日志查询命令。
慢查询分析
要进行慢查询分析,首先,要如第二关一样启用 Profiling 工具,以下例子 Profiling 级别设置为1,时间设置为50ms。其次,要进行过超过 50ms 的操作才会记录到慢查询日志中,存在记录结果。
-
首先,我们在 test 数据库启用 Profiling 工具:
use test
db.setProfilingLevel(1,50) # 设置级别为1,时间为50ms,意味着只有超过50ms的操作才会记录到慢查询日志中
- 然后在 test 数据库的 items 集合中循环插入100万条数据:
for(var i=0;i<1000000;i++)db.items.insert({_id:i,text:"Hello MongoDB"+i})
-
返回所有结果:
db.system.profile.find().pretty()
{ "op" : "insert", #操作类型,有insert、query、update、remove、getmore、command "ns" : "test.items", #操作的集合 "command" : { "insert" : "items", "ordered" : true, "$db" : "test" }, "ninserted" : 1, "keysInserted" : 1, "numYield": 0, #该操作为了使其他操作完成而放弃的次数。通常来说,当他们需要访问还没有完全读入内存中的数据时,操作将放弃。这使得在MongoDB为了放弃操作进行数据读取的同时,还有数据在内存中的其他操作可以完成 "locks": { #锁信息,R:全局读锁;W:全局写锁;r:特定数据库的读锁;w:特定数据库的写锁 "Global" : { "acquireCount" : { "r" : NumberLong(1), "w" : NumberLong(1) } }, "Database" : { "acquireCount" : { "w" : NumberLong(1) } }, "Collection" : { "acquireCount" : { "w" : NumberLong(1) } } }, "responseLength" : 45, #返回字节长度,如果这个数字很大,考虑值返回所需字段 "protocol" : "op_msg", "millis" : 60, #消耗的时间(毫秒) "ts" : ISODate("2018-12-07T08:19:11.997Z"), #该命令在何时执行 "client" : "127.0.0.1", #链接ip或则主机 "appName" : "MongoDB Shell", "allUsers" : [ ], "user" : "" }
profile 部分字段解释:
-
op :操作类型;
-
ns :被查的集合;
-
commond :命令的内容;
-
docsExamined :扫描文档数;
-
nreturned :返回记录数;
-
millis :耗时时间,单位毫秒;
-
ts :命令执行时间;
-
responseLength :返回内容长度。
常用的慢日志查询命令
自己在命令行尝试输入以下命令,分析查看返回结果:
-
返回最近的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 : 'test.items' } ).pretty()
-
返回大于5毫秒慢的操作:
db.system.profile.find({ millis : { $gt : 5 } } ).pretty()
-
从一个特定的时间范围内返回信息:
db.system.profile.find( { ts : { $gt : new ISODate("2018-12-09T08:00:00Z"), $lt : new ISODate("2018-12-10T03:40:00Z") } } ).pretty()
-
特定时间,限制用户,按照消耗时间排序:
db.system.profile.find( { ts : { $gt : new ISODate("2018-12-09T08:00:00Z") , $lt : new ISODate("2018-12-10T03:40:00Z") } }, { user : 0 } ).sort( { millis : -1 } ).pretty()
-
查看最新的 Profile 记录:
db.system.profile.find().sort({$natural:-1}).limit(1).pretty()
-
显示5个最近的事件:
show profile
编程要求
在右侧命令行中,进行以下操作:
-
使用 MongoDB 的 mydb3 数据库;
-
开启并设置其慢查询日志功能,设置为模式1,时间限制为 5ms;
-
循环插入10万条数据到集合 items1 中,格式如下:
{_id:i,text:"Hello MongoDB"+i}
(插入方法不记得的同学,可参考 游标 这一节内容)
- 循环插入10万条数据到集合 items2 中,格式如下:
-
{_id:i,text:"Hello MongoDB"+i}
以上操作计入测评,请同学们进行完以上操作后对以下几条命令进行练习(不计入测评):
-
查看最新的 Profile 记录;
-
显示最近的慢查询事件;
-
特定时间(你自己操作时间段内),按照消耗时间排序的慢查询;
-
返回大于7毫秒慢的操作;
-
返回 items1 集合的慢查询。