Linux系统下MongoDB性能调优的核心方法
--storageEngine=wiredTiger),其缓存大小通过storage.wiredTiger.engineConfig.cacheSizeGB参数设置,推荐值为服务器物理内存的50%-70%(需避免占用过多内存影响系统及其他应用)。同时,调整操作系统参数:vm.swappiness=10(降低交换空间使用倾向,减少磁盘I/O)、vm.overcommit_memory=1(允许内存超额分配,避免内存分配失败)。storage.wiredTiger.engineConfig.compressor=snappy,推荐Snappy算法,平衡压缩率与CPU开销),减少磁盘空间占用和I/O操作。net.maxIncomingConnections(默认10000,可根据并发连接数调整)和net.maxOutgoingConnections(默认10000),优化网络缓冲区大小,避免连接数过多导致的性能下降。operationProfiling.mode=slowOp,默认100ms),通过db.setProfilingLevel()记录慢查询,结合db.profile()查看分析结果,定位性能瓶颈。find、sort、aggregate中的字段)创建索引,复合索引需遵循ESR规则(等值查询→排序→范围查询),例如查询{a:1, b:1}.sort({c:-1})需创建索引{a:1, b:1, c:-1}。db.collection.getIndexes()审查索引,删除不再使用的索引。db.collection.find({a:1}, {a:1, _id:0})),避免访问源文档,提升查询效率(可通过explain("executionStats")查看totalDocsExamined是否为0)。reIndex()命令重建索引,清理碎片,提升索引性能。{field:1, _id:0})仅返回需要的字段,减少网络传输量和内存占用。skip()+limit()的大偏移量分页(如skip(10000).limit(10)),改用基于索引字段的范围查询(如find({age:{$gt:100}}).sort({age:1}).limit(10)),提升分页性能。$match阶段放在管道前端(减少后续阶段处理的数据量),合理使用$lookup(联接字段需建立索引),避免不必要的$unwind操作(会增加数据量)。ObjectId引用),避免文档过大。user_id),避免数据倾斜(如避免使用单调递增的字段作为分片键)。readPreference=secondary)将读请求分发到从节点,减轻主节点负载。mongostat(监控每秒操作数、读写延迟)、mongotop(监控集合级别的读写时间)实时监控数据库性能。db.adminCommand({getLog:"slow"}))),定位高频慢查询,针对性优化索引或查询语句。