Ubuntu环境下MongoDB性能调优技巧
storage.wiredTiger.engineConfig.cacheSizeGB参数设置)。例如,16GB内存服务器可设置cacheSizeGB: 10(约占62.5%),避免占用过多内存影响系统及其他应用。storage.journal.enabled: true)以保证数据持久性。vm.nr_hugepages=0参数),避免内存碎片化;调整vm.swappiness=0(降低交换分区使用概率),提升内存利用率。/etc/mongod.conf中,通过net.maxIncomingConnections设置最大连接数(如net.maxIncomingConnections: 1000),避免连接数过多导致资源耗尽;根据网络带宽调整net.bufferSize(默认16MB,高带宽环境可适当增大)。storage.wiredTiger.engineConfig.journalCompressor(日志压缩)、storage.wiredTiger.collectionConfig.blockCompressor(集合数据压缩)进一步优化存储效率。operationProfiling模块开启慢查询日志,设置slowOpThresholdMs(如slowOpThresholdMs: 100,单位毫秒),记录执行时间超过阈值的查询,便于后续分析与优化。where、sort、join条件中的字段)创建索引,例如db.users.createIndex({age: 1})(升序索引)。复合索引需根据查询模式设计字段顺序(如db.users.createIndex({status: 1, age: -1}),适用于status筛选后按age降序查询的场景)。db.collection.reIndex()重建索引,清理碎片(尤其在高写入负载场景下);通过db.collection.stats()查看索引大小与使用情况,删除未使用索引(db.collection.explain("executionStats").find({...}).executionStats.executionStages.inputStage.stage显示IXSCAN的索引才是有效索引)。db.users.find({name: "John"}, {name: 1, _id: 0})配合db.users.createIndex({name: 1}))。explain("executionStats")分析查询计划,避免全表扫描(winningPlan.stage为COLLSCAN);确保查询条件能利用索引(如db.users.find({age: {$gt: 18}}).explain()应显示IXSCAN)。db.users.find({age: {$gt: 18}}, {name: 1, age: 1, _id: 0})(不返回_id字段),降低网络传输压力。skip()与limit()进行分页(如db.users.find().skip(20).limit(10)),避免一次性获取大量数据;采用insertMany()(批量插入)、updateMany()(批量更新)替代单条操作,减少网络往返次数。user_id、order_id等高基数字段),避免热点问题(如{timestamp: 1}可能导致写入集中在最新分片)。sh.shardCollection("db.collection", {shardKey: 1})手动分片;监控分片集群的chunk分布(sh.status()),确保数据均匀分布。mongostat(监控每秒操作数、读写延迟)、mongotop(监控集合级读写时间)实时查看数据库性能。db.collection.validate()检查数据完整性;每月清理无用数据(如过期日志、临时集合);每季度评估索引策略(根据查询模式变化调整索引)。