MongoDB性能调优策略
db.collection.createIndex({ field: 1 }))。复合索引需遵循“最左前缀原则”(如{ field1: 1, field2: -1 }可支持field1查询、field1+field2排序等场景),覆盖索引应包含查询所需的所有字段(避免回表读取文档)。db.collection.getIndexes()清理无用索引(如不再使用的查询字段索引)。explain("executionStats")查看查询执行计划,重点关注winningPlan中的索引使用情况(如是否使用了预期的索引)、executionStages中的inputStage(如IXSCAN表示使用了索引,COLLSCAN表示全表扫描),针对性优化未使用索引的查询。{ field: 1, _id: 0 }只返回必要字段),避免在查询条件中使用正则表达式(除非使用^开头的前缀匹配,否则可能导致全表扫描)。skip()+limit()(当skip值较大时,性能会急剧下降),改用_id游标分页(如{ _id: { $gt: lastObjectId } }),利用索引快速定位下一页数据。$match阶段提前过滤数据(减少后续阶段的处理量),必要时使用allowDiskUse: true(允许聚合操作使用磁盘空间,避免内存溢出),对于预先聚合的结果可存储在单独集合中(如定期执行$out将聚合结果写入新集合)。storage.wiredTiger.engineConfig.cacheSizeGB设置为服务器总内存的50%-75%(预留足够内存给操作系统和其他进程),避免内存不足导致频繁磁盘交换(swap)。blockCompressor可选snappy(默认,压缩率适中)或zlib(高压缩率,CPU开销大)),相比MMAPv1引擎有更好的性能和压缩效果。readPreference设置为secondary让查询路由到从节点。userId等高频查询字段),避免数据倾斜(可使用哈希分片hashed解决热点问题)。setParameter设置slowOpThresholdMs阈值,如100ms),定期分析慢查询日志(如通过mongotop查看集合级查询时间分布,mongostat查看操作级性能指标),定位性能瓶颈。db.collection.reIndex()重建索引,优化索引碎片(碎片率过高会导致查询性能下降),删除无用索引(如不再使用的查询字段索引)。explain()分析查询执行计划,serverStatus()查看服务器状态(如内存使用、连接数、锁等待时间),currentOp()查看活跃会话(如长时间运行的查询),结合第三方监控工具(如Prometheus+Grafana、MongoDB Ops Manager)实现实时监控和告警。