插件窝 干货文章 MongoDB性能优化策略,提升数据读写速度

MongoDB性能优化策略,提升数据读写速度

索引 优化 javascript collection 648    来源:    2025-03-27

MongoDB性能优化策略

索引优化

  1. 创建合适的索引

    • 为常用查询条件创建索引
    • 复合索引遵循ESR原则(Equality, Sort, Range)
    db.collection.createIndex({ field1: 1, field2: -1 })
    
  2. 索引选择性

    • 高选择性字段(唯一值多)更适合建索引
    • 避免在低选择性字段(如性别)上单独建索引
  3. 索引覆盖查询

    • 确保查询只需要索引即可完成,无需访问文档
    db.collection.createIndex({ a: 1, b: 1 })
    db.collection.find({ a: 5 }, { b: 1, _id: 0 }) // 被索引覆盖
    

查询优化

  1. 避免全表扫描

    • 使用explain()分析查询执行计划
    db.collection.find({...}).explain("executionStats")
    
  2. 投影优化

    • 只返回需要的字段
    db.collection.find({}, { field1: 1, field2: 1 })
    
  3. 分页优化

    • 使用skip()limit()时配合排序索引
    • 对于大数据集,考虑使用范围查询代替skip

架构优化

  1. 合理设计文档结构

    • 预聚合常用数据
    • 适当使用嵌套文档减少JOIN操作
    • 避免超大文档(>16MB)
  2. 读写分离

    • 从secondary节点读取非关键数据
    db.collection.find().readPref("secondary")
    
  3. 分片集群

    • 大数据集考虑使用分片集群
    • 选择合适的分片键(高基数、分布均匀)

硬件与配置优化

  1. 内存配置

    • 确保工作集(working set)能放入内存
    • 配置适当的WiredTiger缓存大小
    storage:
     wiredTiger:
       engineConfig:
         cacheSizeGB: 8
    
  2. 磁盘优化

    • 使用SSD硬盘
    • 单独配置journal和数据目录到不同磁盘
  3. 操作系统优化

    • 禁用透明大页(THP)
    • 调整文件描述符限制

写入优化

  1. 批量操作

    • 使用批量插入代替单条插入
    db.collection.insertMany([doc1, doc2, doc3])
    
  2. 写入关注级别

    • 非关键数据使用w:1(默认)
    • 关键数据使用w:"majority"
  3. 更新优化

    • 使用$set只更新必要字段
    • 避免全文档替换

监控与维护

  1. 性能监控

    • 使用mongostatmongotop
    • 配置Profiler识别慢查询
    db.setProfilingLevel(1, 50) // 记录超过50ms的查询
    
  2. 定期维护

    • 重建碎片化严重的索引
    db.collection.reIndex()
    
    • 压缩集合回收空间
    db.runCommand({ compact: "collection" })
    
  3. TTL索引

    • 为临时数据设置TTL索引自动过期
    db.collection.createIndex({ createdAt: 1 }, { expireAfterSeconds: 3600 })
    

通过综合应用这些策略,可以显著提升MongoDB的读写性能。实际优化时应根据具体应用场景和负载特点选择合适的策略组合。