Ubuntu环境下MongoDB性能调优的核心手段
storage.wiredTiger.engineConfig.cacheSizeGB参数设置,如16GB内存可设为10GB)。避免内存不足导致频繁磁盘交换(Swap),严重影响性能。echo never > /sys/kernel/mm/transparent_hugepage/enabled),避免MongoDB内存分配延迟。/etc/mongod.conf中,通过net.maxIncomingConnections设置最大连接数(默认10000,可根据并发需求调整),避免连接数过多导致资源耗尽。storage.wiredTiger.engineConfig.cacheSizeGB合理分配缓存大小;开启日志功能(journal.enabled: true)确保数据持久性,但需平衡日志写入对性能的影响。operationProfiling配置慢查询阈值(如slowOpThresholdMs: 100,单位毫秒),记录执行时间超过阈值的查询,便于后续优化。user_id、order_date)创建单字段索引(db.collection.createIndex({field: 1}));对多字段组合查询(如find({status: "active", age: {$gt: 18}})),创建复合索引(db.collection.createIndex({status: 1, age: 1})),注意将选择性高的字段(区分度高的字段)放在前面。db.collection.createIndex({name: 1, age: 1})对应find({name: "John"}, {name: 1, age: 1})),避免查询回表(访问实际文档),减少I/O开销。db.collection.getIndexes()查看索引列表,删除未使用的索引(如通过explain()确认未被查询使用的索引)。explain("executionStats")查看查询执行计划,重点关注totalDocsExamined(扫描文档数)和totalKeysExamined(扫描索引键数)。若totalDocsExamined接近结果集数量,说明索引未有效过滤数据,需调整索引。projection)只返回需要的字段(如db.users.find({age: {$gt: 18}}, {name: 1, age: 1, _id: 0})),减少数据传输量,提升查询速度。skip(10000).limit(10)),改用基于游标的分页(如记录上次查询的_id,下次查询find({_id: {$gt: lastId}}, {limit: 10})),减少数据库扫描量。insertMany()、updateMany()替代循环单条操作,减少网络往返次数,提升写入效率。find({status: "active"})需为status字段创建索引),避免COLLSCAN(全表扫描)。user_id、order_id,需具备高基数和均匀分布特性),避免热点问题(如单调递增的分片键会导致数据集中在少数节点)。readPreference: "secondary"),减轻主节点压力;确保副本集成员数量为奇数(如3节点),避免脑裂问题。mongostat查看每秒操作数、mongotop查看集合级读写时间)或第三方工具(如Percona Monitoring and Management(PMM)、Prometheus+Grafana)实时监控数据库性能指标(如QPS、延迟、内存使用、磁盘I/O)。systemLog.path设置日志路径),关注错误日志(如连接超时、磁盘空间不足)和慢查询日志,及时排查性能问题。compact命令压缩集合碎片(减少磁盘空间占用);使用reIndex命令重建索引(优化索引结构,减少碎片);备份数据(使用mongodump/mongorestore),防止数据丢失。