一、索引优化:精准匹配查询需求
索引是MongoDB查询性能的核心支撑,需围绕查询模式设计高效索引结构。
db.collection.createIndex({user_id: 1}))、复合索引(多条件查询,如db.collection.createIndex({status: 1, create_time: -1}),注意将选择性高的字段放在前面)、多键索引(数组字段,如tags)、文本索引(全文搜索)或地理空间索引(地理位置查询)。db.collection.find({user_id: 1}, {user_id: 1, _id: 0})),MongoDB可直接从索引返回结果,无需访问实际文档,显著降低磁盘IO。db.collection.getIndexes()审查索引,删除未使用或冗余的索引(可通过$indexStats聚合查看索引使用频率)。status字段有“active”“inactive”两种值,create_time有大量重复值,则顺序应为{status: 1, create_time: -1})。二、查询语句优化:减少不必要的开销
查询语句的写法直接影响性能,需遵循“最小化返回、精准过滤”的原则。
limit()方法避免一次性返回大量数据(如db.collection.find().limit(100)),减少网络传输和客户端处理压力。db.collection.find({}, {name: 1, age: 1, _id: 0})),避免传输整个文档(默认包含_id字段,需显式排除)。explain()方法分析查询计划(如db.collection.find({user_id: 1}).explain("executionStats")),确认是否使用了索引(winningPlan中的stage应为IXSCAN而非COLLSCAN)。$where会执行JavaScript代码,无法利用索引,性能远低于普通查询条件(如db.collection.find({$where: "this.age > 18"})应改为db.collection.find({age: {$gt: 18}}))。skip(10000).limit(10)),可使用基于游标的分页(记录上一页最后一条记录的_id,下次查询find({_id: {$gt: last_id}}).limit(10)),避免skip的性能衰减。三、配置优化:适配硬件与业务需求
合理的配置能最大化利用服务器资源,提升查询效率。
storage.wiredTiger.engineConfig.cacheSizeGB参数应设置为系统总内存的50%-75%(如16GB内存可设为8-12GB),确保常用数据和索引保留在内存中,减少磁盘IO。systemLog.verbosity: 0)可减少日志写入频率,但需平衡故障排查需求;启用日志压缩(systemLog.logAppend: true)可减少日志文件大小。net.maxIncomingConnections参数应根据并发连接数调整(如设置为1000),避免连接过多导致资源耗尽;net.port设置为合理的端口(默认27017),避免与其他服务冲突。operationProfiling.mode: "slowOp"可记录慢查询(默认阈值100ms),通过db.currentOp()查看慢查询详情,针对性优化。四、硬件优化:提升基础性能
硬件是性能的基础,需根据业务规模选择合适的配置。
五、分片与复制集:水平扩展与高可用
对于大规模数据或高并发场景,需通过分片和复制集提升性能。
user_id,需具备高基数和均匀分布特性),避免数据倾斜(如某个分片数据量远大于其他分片)。六、监控与维护:持续优化性能
定期监控和维护能及时发现性能瓶颈,保持系统稳定。
mongostat可实时查看查询、插入、更新等操作的QPS(每秒查询数)和延迟;mongotop可查看集合级别的读写时间分布(如mongotop 10表示每10秒刷新一次)。operationProfiling.slowOpThresholdMs: 100),定期分析慢查询(如db.system.profile.find().sort({ts: -1}).limit(10)),找出性能瓶颈(如未使用索引、全表扫描)。db.collection.validate()可查看碎片率),使用db.collection.reIndex()重建索引,优化索引性能。db.collection.remove({create_time: {$lt: ISODate("2025-07-01")}}))。