mongodb性能调试基本技巧
1. 判断哪些是慢查询?
mongodb通过profile来实时的获取性能较慢的查询,设置profile命令如下
db.runCommand { profile: 1, slowms: 200 }
表示开启profile,记录大于200毫秒的操作
profile值有以下含义
-1 | 无变化,返回当前profile值 |
0 | 关闭profile, 这是系统默认的profile值 |
1 | 开启,只记录慢的操作 |
2 | 开启,记录所有操作 |
或者使用MongoVUE工具
开启后,mongodb会生成system.profile的collection来存储哪些慢的操作
2. 分析慢查询
使用.explain()方法分析查询,例如 db.XXX.find(....).explain()则会生成一个对查询的解释:
查询结果最主要关注下面几个字段
- cursor: BasicCursor 表示用的是非索引的查询, BtreeCursor 表示用的是B树查询,同时会告诉用的是哪个索引
- nscanned: 总共扫描的文档和索引的数量
- nscannedObjects: 总共扫描的documents数量
- n: 满足条件对象的数量
- millis: 查询花费的时间(微秒)
一般来讲cursor使用B树查询效率高,如果使用了B树查询仍然慢,则需要根据查询条件和数据特点增加不同的索引,例如增加不同字段的组合索引,使得查询能够优先选择更高效的索引,这个是由mongodb自身内部进行选择的。
参考:
https://blog.openshift.com/design-and-performance-tips-for-mongodb-indexes/
https://docs.mongodb.com/manual/reference/command/profile/