1. 硬件基础优化
2. MongoDB配置文件调整(/etc/mongod.conf)
storage.wiredTiger.engineConfig下设置cacheSizeGB,值为系统内存的50%-75%(如cacheSizeGB: 8)。此参数决定了MongoDB可用的内存缓存,直接影响查询性能。operationProfiling下设置mode: "slowOp",并指定slowOpThresholdMs(如slowOpThresholdMs: 100,单位毫秒)。慢查询日志会记录执行时间超过阈值的查询,帮助定位性能瓶颈。net.maxIncomingConnections(如maxIncomingConnections: 2000),根据应用并发需求增加最大入站连接数,避免连接数过多导致性能下降。3. 索引优化
db.users.createIndex({email: 1})),单字段索引适用于简单查询;复合索引(如db.orders.createIndex({customer_id: 1, order_date: -1}))适用于多条件查询,能大幅提升范围查询和排序性能。db.products.find({category: "electronics"}, {name: 1, price: 1})),避免回表操作(从磁盘读取完整文档),减少I/O开销。可通过explain("executionStats")查看查询是否使用了覆盖索引。db.users.getIndexes()),删除未使用或冗余的索引。reindex()命令重建碎片化索引(如db.large_collection.reIndex()),保持索引的高效性。4. 查询语句优化
db.users.find({age: {$gt: 18}}, {name: 1, age: 1, _id: 0})),避免传输整个文档,降低网络带宽消耗。skip()和limit()实现分页(如db.products.find().skip(20).limit(10)),避免一次性返回大量数据导致内存溢出。db.users.find({email: "test@example.com"}),其中email有索引),可通过explain("executionStats")查看查询计划,确认是否使用了索引。match、group、sort)组合成一个聚合管道(如db.sales.aggregate([{match: {year: 2024}}, {group: {_id: "$product", total: {$sum: "$amount"}}}])),减少中间结果的读写次数,提高查询效率。5. 监控与诊断
mongostat可实时查看数据库操作的QPS(每秒查询数)、延迟等指标;mongotop可查看各个集合的读写时间分布,快速定位慢查询集合。db.adminCommand({getLog: "slowops"})查看慢查询详情,结合explain()分析查询计划,优化慢查询语句。6. 分片与副本集优化(针对大规模数据)
user_id分片),提高查询和写入的横向扩展能力。适用于数据量超过单机内存容量的场景(如TB级数据)。