Step1: 分析数据库正在执行的请求
db.currentOp()
client: 请求是由哪个客户端发起的?
opid: 操作的 opid, 有需要的话, 可以通过 db.killOp(opid) 直接干掉的操作
secs_running/microsecs_running: 这个值重点关注, 代表请求运行的时间, 如果这个值特别大, 就得注意了, 看看请求是否合理
query/ns: 这个能看出是对哪个集合正在执行什么操作
lock*: 还有一些跟锁相关的参数
Step2: 分析数据库慢请求
MongoDB 支持 profiling 功能, 将请求的执行情况记录到同 DB 下的 system.profile 集合里, profiling 有 3 种模式
profiling 设置文档在这里, 多看官网文档
关闭 profiling
针对所有请求开启 profiling, 将所有请求的执行都记录到 system.profile 集合
针对慢请求 profiling, 将超过一定阈值的请求, 记录到 system.profile 集合
默认请求下, MongoDB 的 profiling 功能是关闭, 生产环境建议开启, 慢请求阈值可根据需要定制, 如不确定, 直接使用默认值 100ms.
设置 100ms 的慢请求
db.setProfilingLevel(1, { slowms: 100 })
在开启了慢请求 profiling 的情况下(MongoDB 云数据库是默认开启慢请求 profiling 的), 我们对慢请求的内容进行分析, 来找出可优化的点, 常见的包括.
profiling 的结果输出含义在这里, 多看官网文档
CPU 杀手 1: 全表扫描
全集合 (表) 扫描 COLLSCAN, 当一个查询 (或更新, 删除) 请求需要全表扫描时, 是非常耗 CPU 资源的, 所以当你在 system.profile 集合 或者 日志文件发现 COLLSCAN 关键字时, 就得注意了, 很可能就是这些查询吃掉了你的 CPU 资源; 确认一下, 如果这种请求比较频繁, 最好是针对查询的字段建立索引来优化.
一个查询扫描了多少文档, 可查看 system.profile 里的 docsExamined 的值, 该值越大, 请求 CPU 开销越大.
> 关键字: COLLSCAN, docsExamined
CPU 杀手 2: 不合理的索引
有的时候, 请求即使查询走了索引, 执行也很慢, 通常是因为合理建立不太合理(或者是匹配的结果本身就很多, 这样即使走索引, 请求开销也不会优化很多)
如下所示, 假设某个集合的数据, x 字段的取值很少(假设只有 1,2), 而 y 字段的取值很丰富.
- {
- x: 1, y: 1
- }
- {
- {
- x: 1, y: 2
- }
- {
- {
- x: 1, y: 3
- }
- .
- ......
- {
- {
- x: 1, y: 100000
- }
- {
- {
- x: 2, y: 1
- }
- {
- {
- x: 2, y: 2
- }
- {
- {
- x: 2, y: 3
- }
- .
- ......
- {
- {
- x: 1, y: 100000
- }
要服务 {x: 1: y: 2} 这样的查询
db.createIndex( {y: 1 } ) 效果好, 因为 y 相同取值很少
d
db.createIndex( {y: 1, x: 1 } ) 效果好, 因为 y 相同取值少
一个走索引的查询, 扫描了多少条索引, 可查看 system.profile 里的 keysExamined 字段, 该值越大, CPU 开销越大.
>关键字: IXSCAN,keysExamined
CPU 杀手 3: 大量数据排序
当查询请求里包含排序的时候, 如果排序无法通过索引满足, MongoDB 会在内存李结果进行排序, 而排序这个动作本身是非常耗 CPU 资源的, 优化的方法仍然是建立索引, 对经常需要排序的字段, 建立索引.
当你在 system.profile 集合 或者 日志文件发现 SORT 关键字时, 就可以考虑通过索引来优化排序. 当请求包含排序阶段时, system.profile 里的 hasSortStage 字段会为 true.
> 关键字: SORT,hasSortStage
======================MongodDB shard key 片键选择 =====================
主要考虑 key 的「离散度」以及「频率」, 离散度越高越好, 能更好的分散数据; 频率越低越好, 避免出现热点;
===========MongoDB 连接串样例 ========================
正确连接分片集群的姿势
要正确连接复制集, 需要先了解下 MongoDB 的 Connection String URI, 所有官方的 driver 都支持以 Connection String 的方式来连接 MongoDB 分片集群.
下面就是 Connection String 包含的主要内容
- MongoDB://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
- MongoDB:// 前缀, 代表这是一个 Connection String
username:password@ 如果启用了鉴权, 需要指定用户密码
hostX:portX 多个 mongos 的地址列表
/database 鉴权时, 用户帐号所属的数据库
?options 指定额外的连接选项
来源: http://www.linuxidc.com/Linux/2018-11/155428.htm