在使用MongoDB使用过程中,经常会遇到查询超时报错、数据库响应慢、CPU达到100%等性能问题。近期,维格娜丝B2C商城出现无法访问的现象,经定位发现是由于云数据库MongoDB的CPU满载导致的服务不可用。通过分析云数据库监控信息,我们发现在每隔几天就会出现一次CPU满载的情况。在和运营人员沟通后得知,维格娜丝公众号每周五早上都会进行推文,而在推文之后,MongoDB的CPU就会达到满载,同时,并发连接数达到100+。我们选购的MongoDB是2核4G,理论连接数是1000,因此这个问题不是硬件性能瓶颈造成的。

分析问题

传统方式

db.getCollection(“system.profile”).find({})

阿里云云数据库方式

MongoDB实例 -> 日志管理 -> 慢日志

经排查,我们发现存在大量的慢查询,原因是没有建立索引,全表扫描导致性能差。

解决问题

为了优化慢查询,我们需要为数据库建立索引。

传统方式

传统优化慢查询的方法一般是人工优化慢查询、创建复合索引等方法。有以下缺点:

  • 直连数据库查询,产生性能开销
  • 慢查询缺少统计,需要大量时间去分析

阿里云云数据库方式

CloudDBA -> 索引推荐,可以对慢查询进行统计和索引推荐。

根据【数据库名 + 集合名】分别对每一张表建立索引。

注意事项

我们通过建立索引的方式优化MongoDB性能时,每个集合的索引数尽量控制在5个以内,否则会由于过度优化带来以下问题:

  • 占用存储空间
  • 占用内存
  • 影响写操作的性能

索引创建进度

  1. db.currentOp({
  2. $or: [
  3. { op: "command", "query.createIndexes": { $exists: true } },
  4. { op: "insert", ns: /\.system\.indexes\b/ }
  5. ]
  6. }
  7. )

https://cloud.tencent.com/developer/article/1181014

其他优化方式

见后续章节

https://blog.fundebug.com/2018/09/19/18-principle-to-improve-mongodb-performance/