MongoDB在Ubuntu上的性能调优技巧
free -m
查看内存使用情况,根据业务需求调整)。ufw disable
)、禁用SELinux(如setenforce 0
)等,减少系统负载,释放资源供MongoDB使用。/etc/fstab
中为MongoDB数据目录添加noatime
参数(如/var/lib/mongodb ext4 defaults,noatime 0 2
),禁止系统更新文件的访问时间,减少不必要的磁盘写入。/etc/security/limits.conf
,添加* soft nofile 64000
和* hard nofile 64000
;编辑/etc/systemd/system.conf
,设置DefaultLimitNOFILE=64000
,然后重启系统生效。/etc/mongod.conf
中的storage.wiredTiger.engineConfig.cacheSizeGB
参数,设置为系统内存的70%-80%(如cacheSizeGB: 4
),控制MongoDB使用的内存上限,避免占用过多系统资源。net.maxIncomingConnections
(默认10000,可根据并发需求增加)和net.maxOutgoingConnections
(默认100,可根据应用需求调整),适应高并发连接场景。operationProfiling
部分设置mode: "slowOp"
和slowOpThresholdMs: 100
(阈值可根据业务调整,如100ms),记录慢查询日志,帮助识别性能瓶颈(如未使用索引的查询)。db.users.createIndex({ username: 1 })
),避免全表扫描。{ username: 1, email: 1 }
),创建复合索引可提升查询效率,注意将选择性高的字段(如唯一值多的字段)放在前面。db.users.find({ age: { gt: 18 } }, { name: 1, age: 1, _id: 0 })
),避免回表读取文档,减少磁盘I/O。db.collection.reIndex()
重建碎片化索引,提升索引查询效率;使用db.collection.stats()
分析索引使用情况,删除不再使用的索引(如db.collection.dropIndex("index_name")
),减少写操作开销。db.users.find({ username: "john" })
),避免大范围查询(如{ age: { gt: 0 } }
),减少全表扫描。db.users.find({}, { name: 1, email: 1, _id: 0 })
),减少数据传输量和内存消耗。skip()
和limit()
进行分页(如db.users.find().skip(20).limit(10)
),避免一次性获取大量数据导致内存溢出。match
、group
、sort
)组合在聚合管道中(如db.users.aggregate([{ $match: { age: { gt: 18 } } }, { $group: { _id: "$gender", count: { $sum: 1 } } }])
),减少查询次数,提升效率。cacheSizeGB
)是关键参数,建议设置为系统内存的70%-80%(如4GB内存设置cacheSizeGB: 3
),确保有足够内存缓存常用数据和索引。zstd
(如storage.wiredTiger.engineConfig.compressor: "zstd"
),但会增加CPU开销,需根据业务需求权衡。mongostat
监控数据库操作的速率(如读写次数、延迟),mongotop
监控集合级别的读写时间(如哪些集合耗时高),快速定位性能瓶颈。explain()
方法(如db.users.find({ username: "john" }).explain("executionStats")
)查看查询执行计划,确认是否使用了索引、扫描的文档数量等,针对性优化查询。username
字段分片),提升读写性能和扩展性。mongodump
和mongorestore
定期备份数据(如每日备份),防止数据丢失(如服务器故障、误操作)。