一、硬件层面优化
storage.wiredTiger.engineConfig.cacheSizeGB
参数)。二、文件系统与内核优化
-m 0
(不预留空间)、-E lazy_itable_init=0,lazy_journal_init=0
(加速格式化)、-b 4096
(4KB块大小,与MongoDB页面大小对齐)参数;XFS格式化时可添加-n size=64k
(优化命名空间块大小)、-d agcount=16
(增加分配组,提升并行写入性能)参数。noatime,nodiratime
(禁用访问时间记录,减少元数据写入)、barrier=0
(禁用写屏障,适用于有电池备份的RAID控制器,提升写入性能);XFS挂载时添加noatime,nodiratime,allocsize=512m
(预分配大块空间,减少碎片)、logbufs=8
(增加日志缓冲区,提升写入效率)。deadline
(适合SSD,平衡性能与一致性),通过echo deadline | sudo tee /sys/block/sdX/queue/scheduler
临时设置,通过udev
规则永久生效。vm.dirty_ratio=10
(脏页占内存比例,超过则触发写入)、vm.dirty_background_ratio=5
(后台写入阈值),减少I/O阻塞。vm.swappiness=5
(降低Swap使用优先级,优先利用内存),避免因内存不足导致频繁Swap,影响性能。echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
),避免内存分配延迟,提升MongoDB的内存访问效率。三、MongoDB配置优化
mongod.conf
中设置storage.wiredTiger.engineConfig.cacheSizeGB
(如4GB
),建议为系统可用内存的60%左右(需预留内存给系统和其他应用)。此参数直接影响MongoDB的内存利用率和缓存命中率。storage.journal.enabled=true
),确保数据一致性。可通过调整journal.commitIntervalMs
(默认100ms)参数,平衡数据安全性与写入性能(增大间隔可减少日志写入次数,但增加故障恢复时间)。storage.mmapv1.smallFiles
(减少内存使用);关闭setParameter.textSearchEnabled=true
(若不使用全文搜索,减少资源消耗)。四、索引优化
find
、sort
、group
的字段创建索引(如db.collection.createIndex({field: 1})
),避免全表扫描。例如,查询条件中包含status
和create_time
字段时,可创建复合索引db.collection.createIndex({status: 1, create_time: -1})
。db.collection.find({field: 1}, {field: 1, _id: 0})
),无需访问磁盘上的文档,减少I/O开销。可通过explain("executionStats")
查看isCovered
字段确认是否为覆盖索引。db.collection.reIndex()
重新构建碎片化索引,提升索引查询效率;删除不再使用的索引(通过db.collection.aggregate([{ $indexStats: {} }])
查看索引使用情况),减少内存占用和写入开销。五、查询优化
$where
(JavaScript执行慢)、$all
(全数组匹配)等低效操作符;使用$in
代替多个$or
条件(提升查询效率)。projection
仅返回需要的字段(如db.collection.find({}, {name: 1, age: 1, _id: 0})
),减少数据传输量;使用limit()
限制返回结果数量(如db.collection.find().limit(100)
),避免大量数据加载。operationProfiling.slowOpThresholdMs=100
,单位毫秒),通过db.currentOp()
或mongotop
工具定位慢查询,针对性优化索引或查询语句。六、分片与复制集优化
user_id
、order_id
等高频查询字段),避免数据倾斜(如避免使用单调递增的字段作为分片键)。七、监控与维护
mongostat
(监控QPS、延迟)、mongotop
(监控集合级读写时间)、db.serverStatus()
(查看内存、CPU、I/O使用情况)等工具,实时了解数据库性能状态。db.collection.remove({expire_field: {$lt: new Date()}})
删除过期文档;整理碎片(db.collection.runCommand({"compact": "collectionName"})
),减少磁盘空间占用。