mongodb 结果二次调用_mongodb慢查询记录
在 MySQL中,慢查询日志是经常作为我们优化数据库的依据,那在MongoDB中是否有类似的功能呢?答案是肯定的,那就是MongoDatabase Profiler.不仅有,而且还有一些比MySQL的Slow QueryLog更详细的信息。它就是我们这篇文章的主题。
开启 Profiling 功能
有两种方式可以控制 Profiling 的开关和级别,第一种是直接在启动参数里直接进行设置。
启动MongoDB时加上–profile=级别 即可。
也可以在客户端调用db.setProfilingLevel(级别)命令来实时配置。可以通过db.getProfilingLevel()命令来获取当前的Profile级别。
> db.setProfilingLevel(2); {"was" : 0 , "ok" : 1} > db.getProfilingLevel() |
上面斜体的级别可以取0,1,2 三个值,他们表示的意义如下:
0 – 不开启
1 – 记录慢命令 (默认为>100ms)
2 – 记录所有命令
Profile记录在级别1时会记录慢命令,那么这个慢的定义是什么?上面我们说到其默认为100ms,当然有默认就有设置,其设置方法和级别一样有两种,一种是通过添加–slowms启动参数配置。第二种是调用db.setProfilingLevel时加上第二个参数:
db.setProfilingLevel( level , slowms ) db.setProfilingLevel( 1 , 10 ); |
查询 Profiling 记录
与MySQL的慢查询日志不同,Mongo Profile 记录是直接存在系统db里的,记录位置 system.profile,所以,我们只要查询这个Collection的记录就可以获取到我们的 Profile 记录了。
> db.system.profile.find() {"ts" : "Thu Jan 29 2009 15:19:32 GMT-0500 (EST)" , "info" : "query test.$cmd ntoreturn:1 reslen:66 nscanned:0 query: { profile: 2 } nreturned:1 bytes:50" , "millis" : 0} db.system.profile.find( { info: /test.foo/ } ) {"ts" : "Thu Jan 29 2009 15:19:40 GMT-0500 (EST)" , "info" : "insert test.foo" , "millis" : 0} {"ts" : "Thu Jan 29 2009 15:19:42 GMT-0500 (EST)" , "info" : "insert test.foo" , "millis" : 0} {"ts" : "Thu Jan 29 2009 15:19:45 GMT-0500 (EST)" , "info" : "query test.foo ntoreturn:0 reslen:102 nscanned:2 query: {} nreturned:2 bytes:86" , "millis" : 0} {"ts" : "Thu Jan 29 2009 15:21:17 GMT-0500 (EST)" , "info" : "query test.foo ntoreturn:0 reslen:36 nscanned:2 query: { $not: { x: 2 } } nreturned:0 bytes:20" , "millis" : 0} {"ts" : "Thu Jan 29 2009 15:21:27 GMT-0500 (EST)" , "info" : "query test.foo ntoreturn:0 exception bytes:53" , "millis" : 88} |
列出执行时间长于某一限度(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} |
查看最新的 Profile 记录:
db.system.profile.find().sort({$natural:-1})
Mongo Shell 还提供了一个比较简洁的命令show profile,可列出最近5条执行时间超过1ms的 Profile记录。
Profile 信息内容详解:
ts-该命令在何时执行.
millis Time-该命令执行耗时,以毫秒记.
info-本命令的详细信息.
query-表明这是一个query查询操作.
ntoreturn-本次查询客户端要求返回的记录数.比如, findOne()命令执行时 ntoreturn 为1.有limit(n) 条件时ntoreturn为n.
query-具体的查询条件(如x>3).
nscanned-本次查询扫描的记录数.
reslen-返回结果集的大小.
nreturned-本次查询实际返回的结果集.
update-表明这是一个update更新操作.
fastmod-Indicates a fast modify operation. See Updates. Theseoperations are normally quite fast.
fastmodinsert – indicates a fast modify operation that performedan upsert.
upsert-表明update的upsert参数为true.此参数的功能是如果update的记录不存在,则用update的条件insert一条记录.
moved-表明本次update是否移动了硬盘上的数据,如果新记录比原记录短,通常不会移动当前记录,如果新记录比原记录长,那么可能会移动记录到其它位置,这时候会导致相关索引的更新.磁盘操作更多,加上索引更新,会使得这样的操作比较慢.
insert-这是一个insert插入操作.
getmore-这是一个getmore操作,getmore通常发生在结果集比较大的查询时,第一个query返回了部分结果,后续的结果是通过getmore来获取的。
MongoDB 查询优化
如果nscanned(扫描的记录数)远大于nreturned(返回结果的记录数)的话,那么我们就要考虑通过加索引来优化记录定位了。
reslen 如果过大,那么说明我们返回的结果集太大了,这时请查看find函数的第二个参数是否只写上了你需要的属性名。(类似于MySQL中不要总是select *)
对于创建索引的建议是:如果很少读,那么尽量不要添加索引,因为索引越多,写操作会越慢。如果读量很大,那么创建索引还是比较划算的。(和RDBMS一样,貌似是废话-_-!!)
MongoDB 更新优化
如果写查询量或者update量过大的话,多加索引是会有好处的。以及~~~~(省略N字,和RDBMS差不多的道理)
Use fast modify operations when possible (and usually with these,an index). See Updates.
Profiler 的效率
Profiling 功能肯定是会影响效率的,但是不太严重,原因是他使用的是system.profile来记录,而system.profile 是一个capped collection 这种collection在操作上有一些限制和特点,但是效率更高
mongodb 结果二次调用_mongodb慢查询记录相关推荐
- mongodb不等于某个值_mongodb条件查询不等于
$ne不等于 1.查询x 的值不等于3 的数据db.things.find( { x : { $ne : 3 } } ); 举例如下: C1 表的数据如下:> db.c1.find() { &q ...
- MongoDB 教程二: 添加, 删除,查询 shell命令
视频:MongoDB 教程二: 添加, 删除,查询 shell命令 MongoDB Shell 常用操作命令 MonoDB shell命令操作语法和JavaScript很类似,其实控制台底层的查询 ...
- MongoDB聚合(二)
2019独角兽企业重金招聘Python工程师标准>>> MongoDB聚合(二)2.3 $group $group操作可以将文档根据给定字段的不同值进行分组. 如果选定了需要分组的字 ...
- 基于mcat开发智能合约应用(二)调用合约
#### 准备工作 上一节中已经演示了如何通过`mcat`编译和部署合约,此处演示下怎么使用`mcat`来与合约进行交互. 部署合约后得到合约账户地址 `0xd2548bb40fe57aa9e66ae ...
- mongodb慢查询记录
mongodb慢查询记录 在 MySQL中,慢查询日志是经常作为我们优化数据库的依据,那在MongoDB中是否有类似的功能呢?答案是肯定的,那就是Mongo Database Profiler.不仅有 ...
- php对接阿里云API调用企业税号查询的高级实战案例解析(下拉筛选查询、远程调用API、xm-select组件应用)
阿里云API调用企业税号查询 一.功能描述 1.请求参数 2.GET请求代码 3.返回示例 4.错误码 二.核心代码 1.引入外部JS库 2.构建HTML容器 3.xmSelect回调 总结 一.功能 ...
- shell调用api store查询手机号码归属地
一.api store简介 api store是属于一个API聚合平台,可以向外提供各种的数据服务,比较有代表性的有dev store,百度api store和聚合数据等等,这类服务通过向外提供res ...
- mysql查询并设置高亮_Thinkphp3.2.3设置MySql主从读写分离后,简单调用主数据库查询
图/文:迷神 Thinkphp是一款不错的国产框架,使用范围广,应用也比较多.随着网站访问增大往往需要使用mysql主从同步功能,本身Thinkphp自带了主从读写分离的功能了. 但是我们经常有一个场 ...
- FreeSql (二十)多表查询 WhereCascade
WhereCascade 多表查询时非常方便,有了它可以很轻松的完成类型软删除,租户条件的功能. IFreeSql fsql = new FreeSql.FreeSqlBuilder().UseCon ...
最新文章
- 从银行网点拒绝普通客户 看互联网银行的“微众市场
- vb.net读取excel并写入dgv_如何用Python读取Excel中的图片?然后写入图片?
- Python 命令行非阻塞输入
- ionic4请求skynet服务器的资源跨域问题
- 一句Python,一句R︱pandas模块——高级版data.frame
- java程序cpu飙升问题排查过程
- 永中office属于职称计算机吗,永中office
- python 百度人脸 sdk_深更半夜实现python百度api人脸识别
- mysql用户名密码忘了怎么办_mysql用户密码忘了怎么办
- 「运维有小邓」搜索日志数据以作为网络安全情报
- easyui 简单风格的遮罩
- 抖音算法实习生面经(一面+二面)
- 教你快速高效接入SDK——Unity统一接入渠道SDK(Android篇)
- Competing-Consumers模式
- 2d与2.5d坐标转换_视觉SLAM:搞定坐标系、三角测量、PnP
- excel 用公式查找单元格
- Vue路由的动态添加和缓存
- Flask入门(一)之消息闪现、请求扩展、中间件、蓝图、上下文管理
- 分布式系统下的认证与授权
- 独立端漫画小程序源码/看漫画微信小程序源码
热门文章
- 近期数据挖掘学习_计划安排及相关资料(定期更新)
- LoveLive!出了一篇AI论文:生成模型自动写曲谱
- 12门课100分直博清华!这份成绩单冲上热搜,但学霸小伙也曾考过25分
- PyTorch 1.6正式发布!新增自动混合精度训练、Windows版开发维护权移交微软
- 华为提出DyNet:动态卷积
- 腾讯博士:年薪60万辞职去教书,你想要哪种生活?
- 没想到!大数据发现微信上使用最多的表情竟是...原谅很多人不知道
- 爬虫之使用verify参数忽略CA证书
- 普适方案|资管新规落地,资管领域存量市场竞争激烈。专家:得转型(附产品推广)
- CMake编译工具与项目构建