1. 硬件资源优化
storage.wiredTiger.engineConfig.cacheSizeGB配置),确保索引和热点数据能缓存在内存中,减少磁盘I/O。2. 配置文件调优
storage.engine: wiredTiger。storage.wiredTiger.engineConfig.cacheSizeGB(如8GB内存可设为6GB),避免缓存过大占用过多系统内存或过小导致频繁磁盘交换。net.maxIncomingConnections(如5000)以支持更多并发连接;开启tcpNoDelay(默认开启)减少TCP延迟;设置SO_REUSEADDR(默认开启)允许快速重用端口,提升网络吞吐量。journal的syncPeriodSecs(设为100ms,默认1000ms)减少日志同步频率,但需权衡数据安全性(建议生产环境保持默认);开启日志轮转(systemLog.logRotate: reopen)避免日志文件过大占用磁盘空间。3. 索引策略优化
username、order_id)创建单字段索引(db.collection.createIndex({field: 1}));为多字段组合查询创建复合索引(如db.collection.createIndex({field1: 1, field2: -1})),注意将筛选条件多的字段放在前面。db.collection.createIndex({field1: 1, field2: 1})查询{field1: 1, field2: 1}),避免访问文档本身,减少I/O开销。可通过explain("executionStats")的isCovered字段确认是否为覆盖查询。db.collection.getIndexes()查看现有索引,删除不再使用的冗余索引(如db.collection.dropIndex({field: 1}));定期执行db.collection.reIndex()重建索引,解决索引碎片化问题(碎片率超过30%时建议重建)。4. 查询语句优化
explain("executionStats")的winningPlan查看索引使用情况),避免使用$or、$in(大量数据时)等可能导致全表扫描的操作符。db.collection.find({query}, {field1: 1, _id: 0})),减少网络传输量和客户端处理时间。skip()+limit()分页时,当skip值较大(如超过1万)时,改用基于索引的范围查询(如db.collection.find({field: {$gt: lastValue}}).limit(pageSize)),避免skip的性能下降。insertMany()、updateMany()替代单条插入/更新,减少网络往返次数,提升吞吐量(如批量插入1000条数据比单条插入快3-5倍)。5. 架构部署优化
replication.replSetName: "rs0"。user_id、order_date),避免热点问题(如单调递增的分片键会导致写入集中在单个分片)。/etc/security/limits.conf中增加mongod hard nofiles 64000、mongod hard nproc 64000,提升MongoDB的文件描述符和进程数限制;关闭透明大页(THP)(echo never > /sys/kernel/mm/transparent_hugepage/enabled),减少内存管理开销;调整内核参数(vm.dirty_ratio=10、vm.dirty_background_ratio=5),优化脏页刷新频率,提升写入性能。6. 监控与持续调优
mongostat(查看每秒操作数、读写延迟)、mongotop(查看集合级读写时间)实时监控MongoDB性能;开启慢查询日志(operationProfiling.mode: slowOp、operationProfiling.slowOpThresholdMs: 100),记录执行时间超过阈值的查询,针对性优化。explain()分析慢查询,每月审查索引使用情况(删除未使用的索引),根据业务增长调整配置参数(如增加WiredTiger缓存大小、扩展分片数量)。