一、硬件与操作系统基础优化
/etc/fstab
文件,为MongoDB数据目录添加noatime
挂载选项(避免记录文件访问时间,提升读取性能),执行mount -o remount /data
重新挂载生效;调整内核参数:增大文件描述符限制(ulimit -n 64000
)、进程/线程数限制(ulimit -u 64000
),禁用透明大页(THP,减少内存管理开销,编辑/etc/default/grub
添加transparent_hugepage=never
,更新GRUB后重启)。二、MongoDB配置文件优化
编辑/etc/mongod.conf
(MongoDB主配置文件),重点调整以下参数:
WiredTiger
(默认引擎,支持压缩和更好的并发控制),配置缓存大小(根据服务器内存调整,建议不超过总内存的70%,如storage.wiredTiger.engineConfig.cacheSizeGB: 8
)。net.maxIncomingConnections: 5000
),启用TCP优化选项(net.socketOptions.tcpNoDelay: true
、net.socketOptions.keepAlive: 1
,减少网络延迟)。warning
或error
,减少磁盘I/O,systemLog.verbosity: 1
);开启慢查询日志(阈值设为100ms,operationProfiling.mode: slowOp
、operationProfiling.slowOpThresholdMs: 100
,便于定位性能瓶颈)。三、索引优化(关键性能提升手段)
user_id
、created_at
)创建单字段索引(db.collection.createIndex({ field: 1 })
);对多字段组合查询(如status=1 AND create_time>='2025-01-01'
)创建复合索引(db.collection.createIndex({ status: 1, create_time: -1 })
,注意排序方向)。db.collection.createIndex({ title: 1, author: 1 })
,查询find({ title: "MongoDB" }, { _id: 0, title: 1, author: 1 })
可直接从索引获取数据,避免回表查询)。db.collection.getIndexes()
查看索引列表,删除未使用或重复的索引(db.collection.dropIndex("index_name")
),减少索引维护开销。四、查询优化(减少资源消耗)
db.articles.find({ category: "tech" }, { title: 1, summary: 1, _id: 0 })
),减少网络传输量和内存占用。explain("executionStats")
分析查询执行计划(如db.collection.find({ field: value }).explain("executionStats")
),确保查询使用了索引(winningPlan.stage
应为IXSCAN
而非COLLSCAN
)。$match
前置(尽早过滤数据,减少中间结果集大小),合理使用$project
(减少字段返回),避免在聚合管道中进行复杂计算(如$group
前过滤数据)。insertMany
、updateMany
替代单条插入/更新(减少网络往返次数,提升吞吐量)。五、分片与复制集部署(大规模数据处理)
rs.initiate({ _id: "rs0", members: [{ _id: 0, host: "192.168.1.1:27017" }, { _id: 1, host: "192.168.1.2:27017" }, { _id: 2, host: "192.168.1.3:27017" }] })
),提升数据可用性和读取性能(从节点可处理读请求,主节点专注写入)。user_id
,避免数据倾斜),将数据水平切分到多个分片节点(如sh.enableSharding("database_name")
、sh.shardCollection("database_name.collection_name", { shard_key: 1 })
),提升写入和查询性能。六、监控与持续调优
mongostat
(实时监控读写操作、延迟、锁等待等指标)、mongotop
(查看集合级别的读写时间分布)快速定位性能问题。Prometheus+Grafana
(可视化监控CPU、内存、磁盘I/O、连接数等指标,设置告警阈值);使用Percona Monitoring and Management (PMM)
(深入分析慢查询、锁竞争、索引使用情况)。systemLog.logRotate: rename
,避免日志文件过大占用磁盘空间);定期备份数据(使用mongodump
/mongorestore
或专用备份工具,如Ops Manager
);升级MongoDB版本(及时获取性能改进和安全修复)。