性能调优的前提是具备合适的硬件资源,需优先满足以下要求:
storage.wiredTiger.engineConfig.cacheSizeGB
参数配置),避免内存不足导致频繁磁盘交换。编辑/etc/mongod.conf
(MongoDB主配置文件),调整关键参数以匹配业务需求:
cacheSizeGB: 4
,根据服务器内存调整);启用集合压缩(如blockCompressor: snappy
),减少磁盘占用并提升I/O效率。0.0.0.0
(允许远程访问,生产环境需限制可信IP);调整maxIncomingConnections
(如1000
),适应高并发连接场景。replication.replSetName: "rs0"
,后续通过rs.initiate()
初始化副本集,提升读取性能和数据冗余。索引是MongoDB性能的核心,需遵循以下原则:
username
、email
)创建单字段索引(db.users.createIndex({ username: 1 })
);对多字段联合查询(如name
+age
)创建复合索引(db.users.createIndex({ name: 1, age: 1 })
)。db.collection.getIndexes()
检查并删除未使用的索引。db.users.find({ username: 1 }, { username: 1, _id: 0 })
),MongoDB可直接从索引获取数据,无需访问实际文档,大幅提升查询速度。explain("executionStats")
(如db.users.find({ username: "admin" }).explain("executionStats")
)查看索引使用情况,识别未走索引的查询并优化。优化查询语句可减少资源消耗,提升响应速度:
$where
、$regex
等低效操作符,尽量使用精确匹配(如{ age: 25 }
)或范围查询(如{ age: { $gt: 18 } }
)。projection
参数限制返回字段(如db.users.find({}, { username: 1, email: 1, _id: 0 })
),避免返回不必要的数据(如_id
),减少网络传输量。{ age: { $lt: 0 } }
)或无索引字段查询。bulkWrite()
替代单条插入/更新(如db.users.bulkWrite([{ insertOne: { document: { name: "Alice" } } }, { updateOne: { filter: { name: "Bob" }, update: { $set: { age: 30 } } } }])
),减少网络往返次数,提升吞吐量。内存是MongoDB的性能瓶颈之一,需合理配置:
storage.wiredTiger.engineConfig.cacheSizeGB
(如4GB内存服务器可设为2-3GB),确保缓存足够容纳热点数据和索引。storage.wiredTiger.collectionConfig.blockCompressor
选择压缩算法(snappy
、zlib
或lz4
),snappy
为默认选项(平衡压缩率与性能),zlib
压缩率更高但消耗更多CPU。compact
命令(如db.runCommand({ compact: 'users' })
)整理数据文件,回收未使用的空间;对于严重碎片化的集合,可使用repairDatabase
修复。对于大规模数据或高并发场景,需通过架构扩展提升性能:
replication.replSetName
),将读操作指向secondary
节点(通过readPreference: "secondaryPreferred"
),减轻主节点压力,提升读取性能。sh.enableSharding("mydb")
)将数据分散到多个服务器,水平扩展存储和计算能力;选择合适的分片键(如user_id
),避免数据倾斜。rs.status()
),确保同步正常。持续监控是性能调优的重要环节,需定期执行以下操作:
mongostat
(监控每秒查询次数、插入/更新/删除操作数)和mongotop
(查看热点集合的读写时间)实时监控性能;通过db.currentOp()
查看当前正在执行的操作,识别慢操作。systemLog.slowQueryLog: true
,systemLog.slowQueryThresholdMs: 100
),通过explain()
分析慢查询的执行计划,优化索引或查询语句。reIndex()
重建碎片化索引;每月执行repairDatabase
修复数据文件;定期备份数据(使用mongodump
),确保数据安全。