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" :

3个字段的意义:

  • ts:时间戳
  • info:具体的操作
  • millis:操作所花时间,毫秒

explain 功能查看mongo对查询时使用索引后的优化结果

demo
通过查询 age < 10 的数据来观察索引的时候情况

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

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

db.tableName.createIndex(keys, options)
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);
1)mongo是一个面向文档的数据库,它集合了nosqlsql数据库两方面的特性。
2)所有实体都是在首次使用时创建。
3)没有严格的事务特性,但是它保证任何一次数据变更都是原子性的。
4)也没有固定的数据模型
5)mongo以javascript作为命令行执行引擎,所以利用shell进行复杂的计算和查询时会相当的。
6)mongo本身支持集群和数据分片
7)mongo是c++实现的,支持windows mac linux等主流操作系统
8)性能优越,速度快
2.mongo常用操作
1.增删操作
     db.user.insert({name:’aaaa’,a
 读取Sql()
 索引目录:./indexDirSql
 索引字段:id、author、jconf、year、firstAuthorOrg、secordAuthorOrg、thirdAuthorOrg、nCite、content
 年份:2003-2013(现在)
 jconf:缩写。 大写的 39 个 CCF A 类会议
XXAuthorOrg:从论文或网站中提取的原始组织数据
nCite:-1 表示未找到
内容:以上所有内容
countOrgNew(字符
                                    JS脚本强制kill掉MongoDB查询 以下是用JavaScript脚本写的循环kill操作,它可以强制kill MongoDB数据库查询。很多时候,有些查询导致MongoDB压力很大, 花了点时间写了个脚本循环kill些查询操作。 var j = 0;   
var _DEF_TIME = 10; //设置查询时间    
for (var i in db.currentOP().i...
                                    overview内存使用情况
查看Linux虚拟内存管理器是否对内存做了限制如果显示为unlimited表示无限制修改虚拟内存限制查看当前MongoDB的连接数Linux下缺省的Stack大小查看 MongoDB实际使用的Stack大小查看调整stack大小的方法MongoDB释放内存的命令Mongodb自带命令查看其内存使用情况top命令查看free命令查看Mongodb内存大小配置建议
                                    //分组查出这段时间内的sql
db.system.profile.aggregate(
{KaTeX parse error: Expected '}', got 'EOF' at end of input: match:{ts : {gt : new ISODate(“2021-12-20T00:00:00Z”)  ,KaTeX parse error: Expected 'EOF', got '}' at position 41: …-17T09:40:00Z")}̲}},
{group:{_id:
用户中心收到业务方反馈,第三方登录注册出现频繁dubbo调用超时。
org.apache.dubbo.rpc.RpcException: Failed to invoke the method loginWithThird in the service weli.wormhole.rpc.user.center.api.ILoginNeedPhoneService. Tried 1 times of the providers [10.65.5.0:11090] (1/4) from
关闭mongodb日志
进入所在库,将查询的数字设成足够大即可,如下面设置成5万毫秒,就是说只有超过5万毫秒的才会打印日志了
&gt; db.setProfilingLevel(1,50000)
{"was":0,"slowms":100,"ok":1}
&gt;db.setProfilingLevel(0)
{"was":1,"slowms":50000,"ok&qu
                                    文章目录安装、启动和关闭环境安装配置环境变量启动服务方式一方式二:利用配置文件启动服务关闭服务方式一方式二Mongo ShellJavaScript支持Mongo Shell常用命令常用命令创建集合安全认证常用权限创建管理员账号用户认证创建应用数据库用户
安装、启动和关闭
CentOS Linux release 7.9.2009
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.6.tgz
tar -z
                                    通过设置profile来分析哪些操作时查询。
测试环境在mongodb 4, 通过控制台,db.setProfilingLevel不成功,无论是通过mongos还是mongod都不成功,最后只能通过配置文件,–profile=1  --slowms=200,在启动时加载,生效。
测试结果:
不正常的全表扫描
正常的带索引的扫描
② mongoshell来进行临时性打开启Profiling
##登录数据库
mongo --host 127.0.0.1:27017 --username 户名 --password
                                    如何定位 MongoDB 数据库的查询,我想应该是很多刚使用 MongoDB 数据库的朋友最想知道的问题。通过查询的定位,可以辅助对 MongoDB 中的 collection 进行优化。MongoDB 数据库的查询数据其实存放在一个数据库集合 ( collection ) 中(system.profile),如果你不主动创建 system.profile 这个集合,那这个集合就固定1M大小,当查询记录超过1M,就会将历史数据覆盖,循环使用,所以在这里需要根据业务实际情况设置集合大小。
在数据库中,查询日志通常是用来进行优化数据库,MySQL中存在查询Mongodb中也是如此。
在Mongo中的查询属于Mongo Database Profiler,而且其信息详细。
接下来介绍下Mongo查询
二、开启 Profiling 功能
开启并控制Profiling 的方式有两种,
第一种,是直接在启动参数里直接进行设置,启动MongoDB时加上–profile=级别 即可。
第二种是在客户端进行调用。
调用db.setProfilingLevel(级别) 命令来实时配置。
                                    在MySQL中,查询日志是经常作为我
们优化数据库的依据,那在MongoDB中是否有类似的功能呢?答案是肯定的,那就是Mongo Database 
Profiler.不仅有,而且还有一些比MySQL的Slow Query Log更详细的信息。它就是我们这篇文章的主题。
  开启 Profiling 功能
  有两种方式可以控制 Profiling 的开关和级别,第一种是直接在启动参...