1. 硬件资源优化
2. 配置文件调优
storage.wiredTiger.engineConfig.cacheSizeGB设置为服务器总内存的50%-75%(需扣除系统和其他应用的内存占用),避免过大导致内存交换(swap)或过小无法缓存热点数据。net.maxIncomingConnections(默认10000)和net.maxOutgoingConnections(默认10000),根据实际并发连接数适当增大,避免连接数限制导致的拒绝服务;同时设置合理的net.socketTimeoutMS(默认30000ms)和net.connectTimeoutMS(默认10000ms),避免因超时导致的连接堆积。operationProfiling模块开启慢查询监控,设置slowOpThresholdMs(默认100ms)阈值,记录执行时间超过阈值的查询,便于后续优化;例如:operationProfiling.mode: "slowOp"(仅记录慢查询)或"all"(记录所有操作)。storage.journal.enabled设置为true(默认开启),保障数据一致性;在副本集中,合理配置replication.oplogSizeMB(默认为磁盘空间的5%),确保oplog足够大,避免因oplog过小导致的主从同步失败。3. 索引优化
find、sort、aggregate操作的字段创建索引,避免过度索引(每个索引会增加写操作的开销并占用磁盘空间);例如,对user_id、order_date等高频查询字段创建索引。{status: "active", create_time: {$gt: ISODate("2025-01-01")}}),创建复合索引并将选择性高的字段(如status)放在前面,提高索引利用率;复合索引的字段顺序需与查询条件的字段顺序一致。db.collection.createIndex({name: 1, age: 1}, {projection: {name: 1, age: 1}})),使MongoDB无需访问文档即可返回结果,减少磁盘I/O;例如,查询{name: "John", age: 30}可使用覆盖索引。db.collection.reIndex()命令重新构建碎片化严重的索引,优化查询性能;定期使用db.collection.getIndexes()查看索引使用情况,删除未使用或很少使用的索引(通过$indexStats聚合命令分析)。4. 查询优化
projection参数仅返回所需字段,避免传输整个文档;例如:db.users.find({status: "active"}, {_id: 0, name: 1, email: 1}),仅返回name和email字段。$where、$regex等低效操作符(会导致全表扫描),尽量使用索引支持的查询条件(如=、$in、$lt);例如,用db.users.find({age: {$gte: 18}})替代db.users.find({$where: "this.age >= 18"})。match、group、sort)组合成聚合管道,减少中间结果的生成和传输;例如,统计每月活跃用户数:db.orders.aggregate([{ $match: {status: "completed"}}, { $group: { _id: {$month: "$create_time"}, count: {$sum: 1}}}, { $sort: {_id: 1}}])。skip和limit分页,当skip值较大时(如超过1000),改用基于索引的range query(如{create_time: {$lt: last_value}})替代,避免性能下降;例如,记录上一页最后一条记录的create_time,下一页查询{create_time: {$lt: last_create_time}, status: "active"}.limit(20)。5. 分片与复制集优化
user_id、order_date),避免数据倾斜(如避免使用单调递增的字段作为分片键,导致新数据集中在少数分片)。sh.status()查看分片集群的状态,确保各分片的负载均衡;若出现数据倾斜,可通过mergeChunks或splitAt命令调整分片范围,或重新选择分片键。6. 监控与诊断
mongostat(实时显示操作速率,如读写次数、延迟)和mongotop(显示集合级别的读写时间分布)监控数据库性能,快速定位性能瓶颈;例如,mongostat -u admin -p password --authenticationDatabase admin 1每秒刷新一次操作统计。db.setProfilingLevel(1, {slowOpThresholdMs: 100})开启慢查询记录,使用db.system.profile.find().sort({ts: -1}).limit(10)查看最近的慢查询,分析查询的执行计划(explain())和索引使用情况,针对性优化。