CentOS上MongoDB性能调优的关键方法
硬件是性能基础,需根据MongoDB特性调整:
/etc/mongod.conf中设置storage.wiredTiger.engineConfig.cacheSizeGB(如4表示4GB),建议值为服务器总内存的50%-80%(需预留系统和其他应用内存)。索引是查询性能的核心,需合理设计与管理:
find、update、sort的字段创建索引(如db.collection.createIndex({user_id: 1}));{status: 1, create_time: -1}),遵循“最左前缀”原则,避免创建过多单字段索引;db.collection.find({name: "John"}, {name: 1, age: 1, _id: 0})),避免回表读取文档;db.collection.reIndex()重建碎片化索引,通过db.collection.dropIndex("indexName")删除未使用的索引(通过db.collection.aggregate([{ $indexStats: {} }])查看索引使用情况)。优化查询语句可减少资源消耗:
db.collection.find({}, {name: 1, email: 1, _id: 0})),减少数据传输量;limit()限制返回数量(如db.collection.find().limit(100)),避免全表扫描;skip()+limit()(如db.collection.find().skip(20).limit(10))或基于游标的分页(更高效),避免大数据集一次性加载;explain("executionStats")分析查询计划,确保查询使用了索引(winningPlan.inputStage.stage应为IXSCAN而非COLLSCAN);$match放在管道前端(过滤数据),减少中间结果集大小;必要时启用allowDiskUse: true(如db.orders.aggregate([...], {allowDiskUse: true})),允许聚合操作使用磁盘。user_id),确保数据均匀分布(避免热点问题);readPreference: "secondaryPreferred"),将读请求分发到从节点,减轻主节点压力。修改/etc/mongod.conf优化网络与日志设置:
net.maxIncomingConnections(如5000)增加最大连接数,设置socketOptions.keepAlive: 1、tcpNoDelay: true提升网络传输效率;systemLog.verbosity设置为1(warning级别),减少日志量;开启慢查询日志(operationProfiling.mode: "slowOp", operationProfiling.slowOpThresholdMs: 100),便于定位性能瓶颈。持续监控性能状态,及时发现问题:
mongostat(查看每秒操作数、延迟)、mongotop(查看集合级读写时间)实时监控;allowDiskUse: true,避免内存不足导致失败;dd if=/dev/zero of=/data/db/prealloc bs=1M count=10240),减少自动扩容的开销。