1. 索引优化:精准创建与高效使用
索引是提升MongoDB查询速度的核心手段。首先,为高频查询字段创建单字段索引,例如经常按userid查询的交易数据,可执行db.transactions.createIndex({ userid: 1 });对于多条件查询(如同时按name和age筛选),创建复合索引并注意字段顺序——将筛选频率高或选择性强的字段放在前面,如db.users.createIndex({ name: 1, age: 1 })。其次,利用覆盖索引减少IO:确保查询的字段全部包含在索引中,避免访问实际文档(例如db.collection.find({ field1: 1 }, { field1: 1, field2: 1 }).explain("executionStats")中,若winningPlan显示使用了覆盖索引,则查询效率更高)。此外,定期维护索引:通过db.collection.reIndex()重建碎片化索引,删除不再使用的索引(用db.collection.getIndexes()查看现有索引,避免过多索引占用内存和降低写入性能)。
2. 查询语句优化:减少不必要的开销
优化查询语句可直接降低数据库负载。使用explain()分析查询计划:对慢查询执行db.collection.find(query).explain("executionStats"),重点关注executionTimeMillis(执行时间)、winningPlan(执行计划)和usedIndexes(使用的索引),判断是否命中索引。限制返回结果:用limit()减少数据传输量,例如db.users.find({}, { name: 1, email: 1 }).limit(10)仅返回10条记录的name和email字段。避免全表扫描:确保查询条件能利用索引,例如不要在未索引的字段上使用范围查询(如age: { $gt: 18 }),若该字段无索引,会遍历整个集合。优化分页查询:高频率分页时,避免使用skip()(性能随页数增加而下降),改用_id字段分页——记录上一页最后一条记录的_id,下一页查询{ _id: { $gt: lastId } },大幅提升效率。
3. 硬件与配置优化:提升基础性能
硬件配置是查询速度的基础保障。使用SSD替代HDD:SSD的随机读写速度远高于HDD,能显著减少磁盘IO延迟。增加内存:MongoDB使用内存映射文件存储数据,更多的内存可缓存常用索引和数据(例如将wiredTiger缓存大小设置为物理内存的50%-70%,通过/etc/mongod.conf中的storage.wiredTiger.engineConfig.cacheSizeGB调整),减少磁盘访问次数。调整配置参数:在/etc/mongod.conf中优化以下参数——systemLog.destination: file(记录日志到文件,便于排查问题)、net.port: 27017(默认端口,可根据需求修改)、replication.replSetName(若使用副本集,设置副本集名称)。
4. 分片与复制集:水平扩展与高可用
对于大规模数据集,分片是提升查询性能的关键。通过sh.enableSharding("databaseName")启用分片,选择合适的分片键(如userid)并按该键分片(sh.shardCollection("databaseName.collectionName", { userid: 1 })),将数据分布到多个服务器,实现并行查询。复制集可提高读取性能:配置多个副本节点(replication.replSetName: "rs0"),将读请求分发到从节点(db.collection.find().readPref("secondary")),减轻主节点压力。
5. 监控与持续优化:动态调整策略
持续监控数据库性能是优化的前提。使用内置工具:mongostat(实时查看每秒查询次数、插入/更新/删除操作数)、mongotop(查看集合级别的读写时间分布),快速定位性能瓶颈。使用第三方工具:如Prometheus+Grafana(可视化监控内存、CPU、磁盘IO等指标)、Percona Monitoring and Management(PMM,提供详细的MongoDB性能分析),深入排查慢查询和资源瓶颈。定期分析查询模式:根据业务变化调整索引策略(如新增查询字段时及时创建索引),确保索引与查询需求匹配。