Mongodb入门--头歌实验MongoDB 实验——数据库优化

news/2024/12/22 14:09:11/

一、MongoDB 的 Profiling 工具(一)

任务描述

本关任务:完成慢查询设置。

相关知识

为了完成本关任务,你需要掌握: 1.Profiling 是什么工具; 2.如何启用 Profiling 工具。

Profiling 工具

在很多情况下, DBA(数据库管理员)都要对数据库的性能进行分析处理,找出降低性能的根源。而 Profiling 就是 Mongo 自带的一种分析工具来检测并追踪影响性能的慢查询。

慢查询日志一般作为优化步骤里的第一步。通过慢查询日志,定位每一条语句的查询时间。比如超过了50ms,那么查询超过50ms 的语句需要优化。然后它通过 .explain() 解析影响行数是不是过多,所以导致查询语句超过50ms。

所以优化步骤一般就是:

  • 用慢查询日志(system.profile)找到超过50ms 的语句;

  • 然后再通过 .explain() 解析影响行数,分析为什么超过50ms;

  • 决定是不是需要添加索引。

Profiling 级别说明:

  • 0:关闭,不收集任何数据;

  • 1:收集慢查询数据,默认是100毫秒;

  • 2:收集所有数据。

启用 Profiling 工具

Profiling 有两种开启方式,一种是启动服务时配置启动,一种是 mongoshell 中进行实时配置。

mongo shell 中启动配置
  • 查看状态,如图1所示:级别和时间;

    图1


    图 1

  • 查看级别,如图2所示:

    图2


    图 2

  • 设置级别,如图3所示:

    图3


    图 3

  • 设置级别和时间,如图4所示:

    图4


    图 4

    注意:

  • 以上要操作要是在 test 集合下面的话,只对该集合里的操作有效,要是需要对整个实例有效,则需要在所有的集合下设置或则在开启的时候开启参数;

  • 每次设置之后返回给你的结果是修改之前的状态(包括级别、时间参数)。

  • 全局开启 Profiling
  • 可以在 mongod 启动时加上以下参数
mongod --profile=1  --slowms=50
  • 或在配置文件里添加两行,如下所示:
profile = 1
slowms = 50
关闭 Profiling 工具

只需要将收集慢查询数据的时间设置为0就可以关闭,如图5所示:

图5


图 5

 
编程要求

根据提示,在右命令行进行操作,在 mydb 数据库中开启 Profiling,设置级别为1,时间为50ms。

> use mydb
switched to db mydb> db.setProfilingLevel(1,50)
{ "was" : 0, "slowms" : 50, "sampleRate" : 1, "ok" : 1 }

 二、MongoDB 的 Profiling 工具(二)

任务描述

本关任务:完成慢查询设置并自行分析慢查询结果。

相关知识

为了完成本关任务,你需要掌握: 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 集合的慢查询。

> use mydb3
switched to db mydb3> db.setProfilingLevel(1,5) 
{ "was" : 0, "slowms" : 100, "sampleRate" : 1, "ok" : 1 }> for(var i=0;i<100000;i++)db.items1.insert({_id:i,text:"Hello MongoDB"+i})
WriteResult({ "nInserted" : 1 })> for(var i=0;i<100000;i++)db.items2.insert({_id:i,text:"Hello MongoDB"+i})
WriteResult({ "nInserted" : 1 })


http://www.ppmy.cn/news/1424210.html

相关文章

flink mysql数据表同步SQL CDC

1、CDC简介 Change Data Capture FlinkCDC提供一组源数据的连接器&#xff0c;使用变更数据捕获的方式&#xff0c;直接吸收来自不同数据库的变更数据。通过CDC获取源数据表的更新内容&#xff0c;将更新内容作为数据流下发到下游系统&#xff0c;可以做到mysql数据表数据的实…

功能强大的开源数据中台系统 DataCap 2024.03.3 发布

推荐一套基于 SpringBoot 开发的简单、易用的开源权限管理平台&#xff0c;建议下载使用: https://github.com/devlive-community/authx 推荐一套为 Java 开发人员提供方便易用的 SDK 来与目前提供服务的的 Open AI 进行交互组件&#xff1a;https://github.com/devlive-commun…

Spring Boot 连接 RabbitMQ

使用MQ Java获取MQ连接对象 SpringBoot Pom 文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocatio…

Python面试十问

深浅拷贝的区别&#xff1f; 浅拷⻉&#xff1a; 拷⻉的是对象的引⽤&#xff0c;如果原对象改变&#xff0c;相应的拷⻉对象也会发⽣改变。 深拷⻉&#xff1a; 拷⻉对象中的每个元素&#xff0c;拷⻉对象和原有对象不在有关系&#xff0c;两个是独⽴的对象。 浅拷⻉(copy)…

Ubuntu22.04搭建CLion C++开发环境

Ubuntu22.04搭建CLion C开发环境 文章目录 Ubuntu22.04搭建CLion C开发环境1.首先下载CLion2.配置c环境3.创建快捷方式Reference 1.首先下载CLion 进入官网https://www.jetbrains.com/clion/download/#sectionlinux 然后进入自己存放这个压缩包的路径中&#xff0c; sudo mkd…

通过实例学C#之Math类

常用方法 Abs&#xff08;Int16&#xff09; 返回参数的绝对值。 static void Main(string[] args) {int num1 -10;Console.WriteLine(Math.Abs(num1));Console.ReadKey(); }运行结果&#xff1a; 10 Acos(Double)与Cos(Double) Acos(Double):返回参数的反余弦值。 Cos(Doub…

网络安全之反弹Shell

网络安全之反弹Shell 在网络安全和渗透测试领域&#xff0c;“正向Shell”&#xff08;Forward Shell&#xff09;和"反向Shell"&#xff08;Reverse Shell&#xff09;是两种常用的技术手段&#xff0c;用于建立远程访问目标计算机的会话。这两种技术都可以让攻击者…

【个人博客搭建】(3)添加SqlSugar ORM 以及Json配置文件读取

1、安装sqlsugar。在models下的依赖项那右击选择管理Nuget程序包&#xff0c;输入sqlsugarcore&#xff08;因为我们用的是netcore&#xff0c;而不是net famework所以也对应sqlsugarcore&#xff09;&#xff0c;出来的第一个就是了&#xff0c;然后点击选择版本&#xff0c;一…