硬件配置优化
storage.wiredTiger.engineConfig.cacheSizeGB配置),确保常用数据和索引能缓存在内存中。MongoDB配置优化
/etc/mongod.conf中的storage.wiredTiger.engineConfig.cacheSizeGB参数,设置为物理内存的50%-75%(需预留系统和其他进程的内存),避免缓存不足导致频繁磁盘访问。mongod.conf中配置operationProfiling.slowOpThresholdMs(如设置为100ms),记录执行时间超过阈值的查询。通过db.setProfilingLevel(2)开启全量慢查询日志,结合db.system.profile.find()分析慢查询原因。net.maxIncomingConnections(如设置为1000)增加最大连接数,避免连接数过多导致拒绝服务;确保net.bindIp绑定正确的IP地址(如0.0.0.0允许远程访问,或指定内网IP增强安全性)。索引优化
db.users.createIndex({username: 1})),单字段索引适用于精确匹配;复合索引(如db.users.createIndex({age: 1, gender: -1}))适用于多条件查询,字段顺序需按选择性排序(选择性高的字段在前,如age的选择性通常高于gender)。db.users.createIndex({name: 1, age: 1})),使查询可直接从索引中获取数据,无需访问文档本身(通过explain("executionStats")的isCovered字段确认是否为覆盖查询)。db.collection.getIndexes()查看现有索引,删除未使用或重复的索引(如复合索引{a:1,b:1}已覆盖{a:1}的查询,可删除后者)。冗余索引会增加写入开销和存储空间。db.collection.reIndex()重建碎片化索引,优化索引结构,提升查询效率。建议每月或在大量数据更新后执行。查询优化
explain("executionStats")查看查询执行计划,重点关注winningPlan(是否使用索引)、executionTimeMillis(执行时间)、totalDocsExamined(扫描文档数)。若totalDocsExamined远大于返回文档数,需优化索引。db.users.find({username: "john"})需在username上创建索引)。避免使用无法利用索引的操作符(如$where、$regex的模糊匹配(非开头))。db.users.find({age: {$gt: 18}}, {name: 1, age: 1, _id: 0})),避免返回整个文档,减少网络传输量和客户端处理时间。skip()和limit()的大偏移量分页(如skip(10000).limit(10)),性能随偏移量增加而下降。改用_id游标分页(如记录上一页最后一条记录的_id,下一页查询{age: {$gt: 18}, _id: {$gt: lastId}}),提升分页效率。分片与副本集优化
rs.initiate())提供数据冗余和高可用性,读操作可分发到从节点,减轻主节点压力。需在mongod.conf中设置replication.replSetName。user_id),确保分片键具有高基数(唯一值多)和低频率(避免热点问题),提升查询并行度。监控与维护
mongostat(监控QPS、延迟)、mongotop(监控集合级读写时间)实时查看性能指标;或使用第三方工具(如Percona Monitoring and Management(PMM)、MongoDB Atlas)进行更详细的分析和告警。