描述:该优化案例是想表达要了解各个参数的含义,结合业务的分析以及逻辑实现、以及创建索引和列顺序是如何选择的等(这里不再叙述)

环境描述一下

MongoDB版本 3.0.9,副本集3节点,内存64G,cpu 16 core,磁盘2TB SSD,使用WT存储引擎。。。

该表数据量2.6亿多。

大致分析如下:

  1. 通过mloginfo统计查看日志中慢查询的分类(将生产系统日志scp到测试服务器做的)

# mloginfo --queries mongod.log-20160427

namespace    operation  pattern                                            count    min (ms) max (ms)  mean (ms)  95%-ile (ms) sum (ms)

数据库.集合  query     {"gender": 1, "icial": 1, "stVal": 1, "version": 1}  997090   366      3961      802        n/a         51923475

2.抓取程序在慢的时间点日志信息

……

2016-04-26T14:28:48.536+0800 I COMMAND  [conn241925] query 数据库.集合 query: { orderby: { goals: 1, diff: 1 }, $query: { version: true, icial: true, stVal: { $gte: 20 }, gender: "f" } } planSummary: IXSCAN { gender: 1.0, goals: 1.0, difficulty: 1.0, stateValue: 1.0, version: -1.0 } ntoreturn:1000 ntoskip:0 nscanned:145640 nscannedObjects:145628 keyUpdates:0 writeConflicts:0 numYields:1137 nreturned:10 reslen:510 locks:{ Global: { acquireCount: { r: 2276 }, acquireWaitCount: { r: 28 }, timeAcquiringMicros: { r: 22753 } }, Database: { acquireCount: { r: 1138 } }, Collection: { acquireCount: { r: 1138 } } } 1675ms

这样的SQL语句很多,只拿一条分析。

分析各个参数的含义

(1)目前该查询sql使用的索引:IXSCAN { gender: 1.0, goals: 1.0, diff: 1.0, stVal: 1.0, version: -1.0 }

(2)ntoreturn:1000  期望返回数量,query语句期望返回的数量,如limit(40)

(3)nreturned:10  实际返回的数量

(4)ntoskip:0     skip()方法跳过的记录数

(5)nscanned:145640

扫描次数,当扫描次数大于返回的数量(ntoreturn),考虑使用索引

nscanned和nscannedObjects区别:

1、nscanned:根据索引扫描文档,扫描的可能返回实际返回的数量(nreturned:10)

2、nscannedObjects:扫描完整的文档,扫描实际返回的数据(nscannedObjects:145628)

http://stackoverflow.com/questions/13910097/explain-in-mongodb-differences-between-nscanned-and-nscannedobjects

说明

nscanned审议了项目(文件或索引项)的数量。项目可能是对象或索引键。如果一个“覆盖索引”参与, nscanned可能比nscannedObjects高

【nscanned Number of items (documents or index entries) examined. Items might be objects or index keys. If a "covered index" is involved, nscanned may be higher than nscannedObjects.】

nscannedObjects:扫描的文档数量.

(6)acquireCount: 特定模式下获取锁的操作次数

(7)millis: 1675ms  操作执行时间

说明:

没有该值,说明一下,这个值也特别重要

scanAndOrder:布尔值,当为true时,表明排序未使用到索引,只有true时该字段才显示

(8)numYields:1137

就是查询等待插入的次数

查询是需要给写操作让路的

numYields是报告的次数的操作已经产生,以允许其它操作来完成的数量的计数器。

https://docs.mongodb.org/manual/reference/method/db.currentOp/

通常情况下,操作产生时,他们需要访问的MongoDB还没有完全读入内存中的数据。

这允许在内存中的数据,以快速完成,而在MongoDB的数据屈服操作读取等操作。

[

numYields is a counter that reports the number of times the operation has yielded to allow other operations to complete.

Typically, operations yield when they need access to data that MongoDB has not yet fully read into memory.

This allows other operations that have data in memory to complete quickly while MongoDB reads in data for the yielding operation.

]

可能还有其他操作,比如索引建的有问题,即使走索引,需要扫描整个索引,

并且索引不覆盖查询,需要回行加载数据。另外看是不是排序没有用上索引,

导致很多需要单独放内存排序,耗性能耗内存。

另外如果有in查询,数据分散,加载数据可能需要多次随机IO等等。。

(9)观察执行计划、慢日志如下参数(不在说明)

nscannedObjects

nscanned

scanAndOrder

millis

3.在secondary(业务不忙时)分析该sql执行计划

说明:如果该表数据量特别大,比如上亿,加入allPlansExecution参数会执行的非常慢,谨慎在线上数据库执行(我是在测试数据库执行的)。

db.集合.find({ version: true, icial: true, stVal: { $gte: 20 }, gender: "f" }).sort({ goals: 1, diff: 1 }).explain("allPlansExecution")

……"gender": 1, "icial": 1, "stVal": 1, "version": 1

[

{

"stage" : "FETCH",

"filter" : {

"icial" : {

"$eq" : true

}

},

"inputStage" : {

"stage" : "IXSCAN",

"keyPattern" : {

"gender" : 1,

"goals" : 1,

"diff" : 1,

"stVal" : 1,

"version" : -1

},

"indexName" : "gender_1_goals_1_diff_1_stVal_1_version_-1",

"isMultiKey" : false,

"direction" : "forward",

……

}

]

……

索引没有正确添加:执行计划

"executionStats" : {

"executionSuccess" : true,

"nReturned" : 10,  实际返回行数

"executionTimeMillis" : 2000,执行的毫秒

"totalKeysExamined" : 3030000,扫描索引行数

"totalDocsExamined" : 2910000,扫描文档行数

而且有filter过滤操作(即回表操作)。目前该sql选择了gender_1_goals_1_diff_1_stVal_1_version_-1索引。

4.建议

结合业务分析,该sql在业务中每天执行了997090次;分析了该业务和相关sql后,决定违反mongodb建议的联合索引最多5个列的限制:

建议创建如下索引:

db.集合.createIndex({gender:1,version:1,icial:1,goals:1,diff:1,stVal:1},{background:true});

我这边大概执行了90分钟(业务不繁忙时执行的,这边业务晚上比较忙。。。)

再次执行执行计划

……

{

"stage" : "FETCH",

"inputStage" : {

"stage" : "IXSCAN",

"keyPattern" : {

"gender" : 1,

"version" : 1,

"icial" : 1,

"goals" : 1,

"diff" : 1,

"stVal" : 1

},

"indexName" : "gender_1_version_1_icial_1_goals_1_diff_1_stVal_1",

"isMultiKey" : false,

"direction" : "forward",

……

}

}

……

"executionStats" : {

"executionSuccess" : true,

"nReturned" : 10,

"executionTimeMillis" : 0,

"totalKeysExamined" : 10,

"totalDocsExamined" : 10,

访问数据量明显减少了30W倍左右。

在业务实现中使用了hint提示。

创建索引建议:先做等值查询,在做排序,在做范围查询。

转载于:https://blog.51cto.com/beigai/1768353

MongoDB涉及的业务比较慢--慢查询优化分析案例--以及参数说明相关推荐

  1. oracle rac 高并发性能_高并发业务下 JVM 涉及的垃圾回收与性能问题分析与定位...

    最近好多 Java 的朋友问:"高并发业务场景下,JVM涉及的性能问题好难搞呀--".看来是大家的技术经验相对少了些,拿不准该从哪些地方上手,其实,每个技术人要该懂得怎样更好打造自 ...

  2. 中国业务型CDP白皮书 | 爱分析报告

    报告摘要 近年来,C端消费在线化渗透持续提升,全渠道消费成为常态,品牌商流量争夺愈发激烈.通过建设CDP(客户数据管理平台)实现对全渠道用户数据管理,从而实现精准获客.精细化用户运营,几乎成为业内的共 ...

  3. 武汉众邦银行的数字化升级秘诀:让每个业务⼈员都能自助式分析查询

    大数据的发展已经在多个层面推进金融机构的业务模式不断发生改变.比如,在金融产品的营销设计.风险控制.扩展服务半径等方面,大数据都深刻改变了金融机构的经营模式,有效降低了成本.提高了效率. 当前,银行业 ...

  4. 判断用户是否存在再进行新增_基于tableau从商业分析模型角度对业务数据进行多维度分析--【商业分析类】...

    基于tableau从商业分析模型角度对业务数据进行多维度分析 常规商业数据分析方法: 财务多维指标 客户生命周期 客户价值RFM 客户留存分析 购物篮关联分析 漏斗转化ABtest 以下内容主要从商业 ...

  5. Web 攻防之业务安全:密码找回安全案例总结.

    Web 攻防之业务安全:密码找回安全案例总结 业务安全是指保护业务系统免受安全威胁的措施或手段.广义的业务安全应包括业务运行的软硬件平台(操作系统.数据库,中间件等).业务系统自身(软件或设备).业务 ...

  6. MongoDB实战指南(二):索引与查询优化

    数据库保存记录的机制是建立在文件系统上的,索引也是以文件的形式存储在磁盘上,在数据库中用到最多的索引结构就是B树.尽管索引在数据库领域是不可缺少的,但是对一个表建立过多的索引会带来一些问题,索引的建立 ...

  7. 【mongoDB】mongoDB批量修改业务账号密码

    一.背景 1.需要将已有业务数据的复制集 replSet01 数据都导入到 新搭建的复制集replSet02 中 2.新搭建的复制集replSet02  超管用户密码跟源复制集replSet01 的密 ...

  8. 华为废弃的服务器账号密码,华为设备初始用户名和密码大集合,涉及华为业务的工程师都应该牢记和收藏!...

    华为设备种类还是蛮丰富的,不亏是华为! 1.路由器用户名 admin密码 Admin@huawei管理地址 https://192.168.1.1端口 https 2.交换机用户名 admin密码 a ...

  9. 时延敏感业务低概率超时问题分析

    前言 作为阿里云底层提供的基础设施,内部的物理网络和许多网络产品在数据平面给客户的可操作性并不高,从一定程度上来说是个黑盒.当然,在传统的IDC环境,业务和物理网络之间也存在同样的隔阂.所以在遇到业务 ...

最新文章

  1. ubuntu下安装windows虚拟机
  2. c语言编程 三角波,周期矩形波、周期锯齿波、周期三角波,C语言程序.doc
  3. [未解决]jQuery中autocomplete的source格式问题
  4. xampp php连接mysql数据库_关于PHP xampp连接数据库之后查询失败,数据库连接成功,表中也有数据...
  5. mysql如何修改开启允许远程连接
  6. ElasticSearch的一些核心概念
  7. mysql查询报错2014_mysql Hibernate 查询时用别名报错
  8. JS和OC间的通信(使用JavaScriptCore)
  9. 使用PyTorch前向运算时出现“RuntimeError: Expected object of scalar type Long but got scalar type Float for ……”
  10. orocod_kdl学习(一):坐标系变换
  11. Windows下给Git配置SSH
  12. Python基础篇1
  13. 2021泰迪杯B题数据处理4.1
  14. JAVA的三大框架是什么?
  15. 计算机类中英附录,欧盟GMP附录11-计算机系统(中英文对照).pdf
  16. 真格量化学习处理——几个功能小函数
  17. 基于MATLAB的极限与求导(附完整代码)
  18. 期货期权股票资管分仓系统
  19. VUE3 使用 Ant Design Vue的icon图标
  20. mysql查询每行重复_MySQL查询返回重复的行

热门文章

  1. Android优化之内存优化倒计时篇
  2. 华为MateRS巴黎大皇宫首秀 专为保时捷跑车70周年高定手机
  3. SQL、Linq和Lambda表达式 的关系
  4. Centos6.5配置DNS的主从服务器
  5. Python Day Eleven
  6. [转]产品需求文档(PRD)的写作
  7. Paramiko: SSH and SFTP With Python
  8. 【Ubuntu】ubuntu webqq桌面版pywebqq
  9. Linux上安装MongoDB
  10. js 、jq强化复习