在使用MongoDB使用过程中,经常会遇到查询超时报错、数据库响应慢、CPU达到100%等性能问题。近期,维格娜丝B2C商城出现无法访问的现象,经定位发现是由于云数据库MongoDB的CPU满载导致的服务不可用。通过分析云数据库监控信息,我们发现在每隔几天就会出现一次CPU满载的情况。在和运营人员沟通后得知,维格娜丝公众号每周五早上都会进行推文,而在推文之后,MongoDB的CPU就会达到满载,同时,并发连接数达到100+。我们选购的MongoDB是2核4G,理论连接数是1000,因此这个问题不是硬件性能瓶颈造成的。
分析问题
传统方式
db.getCollection(“system.profile”).find({})
阿里云云数据库方式
MongoDB实例 -> 日志管理 -> 慢日志
经排查,我们发现存在大量的慢查询,原因是没有建立索引,全表扫描导致性能差。
解决问题
为了优化慢查询,我们需要为数据库建立索引。
传统方式
传统优化慢查询的方法一般是人工优化慢查询、创建复合索引等方法。有以下缺点:
- 直连数据库查询,产生性能开销
- 慢查询缺少统计,需要大量时间去分析
阿里云云数据库方式
CloudDBA -> 索引推荐,可以对慢查询进行统计和索引推荐。
根据【数据库名 + 集合名】分别对每一张表建立索引。
注意事项
我们通过建立索引的方式优化MongoDB性能时,每个集合的索引数尽量控制在5个以内,否则会由于过度优化带来以下问题:
- 占用存储空间
- 占用内存
- 影响写操作的性能
索引创建进度
db.currentOp({
$or: [
{ op: "command", "query.createIndexes": { $exists: true } },
{ op: "insert", ns: /\.system\.indexes\b/ }
]
}
)
https://cloud.tencent.com/developer/article/1181014
其他优化方式
见后续章节
https://blog.fundebug.com/2018/09/19/18-principle-to-improve-mongodb-performance/