一、硬件资源优化
二、配置文件优化
/etc/mongod.conf中的storage.wiredTiger.engineConfig.cacheSizeGB参数,设置为物理内存的50%-70%(避免占用过多内存导致系统不稳定)。例如:storage:
wiredTiger:
engineConfig:
cacheSizeGB: 4 # 根据服务器内存调整
systemLog.logLevel设置为1(warning)或2(error),减少不必要的日志记录;开启日志轮转(logRotate)防止日志文件过大。ulimit参数(如nofile设置为100000以上),避免连接数过多导致性能下降。三、索引优化(关键环节)
username、age);{username: 1, age: -1});db.collection.createIndex({field1: 1, field2: 1}),查询{field1: 1, field2: 1}时可无需访问文档)。explain()分析查询计划:通过db.collection.find(query).explain("executionStats")查看索引使用情况,重点关注winningPlan中的inputStage.stage(若为IXSCAN表示使用了索引,COLLSCAN表示全表扫描)。db.collection.getIndexes()查看现有索引,删除不再使用的索引(减少写操作开销);db.collection.reIndex()重建索引,解决索引碎片化问题。四、查询语句优化
projection参数只返回需要的字段(如db.collection.find({query}, {field1: 1, field2: 1})),减少数据传输量。find({username: "admin"})而非find({age: {$gt: 18}}),若username有索引则效率更高)。skip()和limit()分页(如db.collection.find({query}).skip(10).limit(5)),避免一次性返回大量数据。$or:$or查询可能导致索引失效,尽量用$in替代(如db.collection.find({$or: [{status: "active"}, {status: "pending"}]})可改为db.collection.find({status: {$in: ["active", "pending"]}}))。五、分片与副本集优化
replication.replSetName)提高读取性能(可将读请求分发到从节点),同时增强数据冗余。sharding.clusterRole)水平扩展。选择高基数、低频率变化的分片键(如user_id),避免数据倾斜(如热点数据集中在某个分片)。六、监控与持续调优
mongostat(监控操作速率)、mongotop(监控集合级读写时间)实时查看性能指标。operationProfiling.slowOpThresholdMs设置为100ms以上),定期分析并优化慢查询。