MongoTemplate 性能优化指南

打印 上一主题 下一主题

主题 1054|帖子 1054|积分 3166

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
MongoTemplate 性能优化指南

1. 查询优化

1.1 合理利用索引



  • 为经常查询的字段创建索引
  • 利用复合索引优化多字段查询
  • 克制利用无索引的排序操作
  1. // 创建索引示例
  2. mongoTemplate.indexOps(Collection.class).ensureIndex(
  3.         new Index().on("field1", Sort.Direction.ASC)
  4.                 .on("field2", Sort.Direction.DESC)
  5. );
复制代码
1.2 投影查询



  • 只查询需要的字段,减少数据传输量
  1. Query query = new Query();
  2. query.fields().include("name").include("age").exclude("id");
  3. List<User> users = mongoTemplate.find(query, User.class);
复制代码
2. 写入优化

2.1 批量操作



  • 利用 bulkOps 进行批量写入/更新
  1.     public void batchInsert(List<User> users) {
  2.         // 分批处理,每批1000条
  3.         int batchSize = 1000;
  4.         List<List<User>> batches = Lists.partition(users, batchSize);
  5.         for (List<User> batch : batches) {
  6.             mongoTemplate.insertAll(batch);
  7.         }
  8.     }
复制代码
2.2 更新优化



  • 只更新须要的字段
  • 利用 $set 而不是整文档更新
  1.     public void batchUpdate(List<User> users) {
  2.         BulkOperations bulkOps = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, User.class);
  3.         for (User user : users) {
  4.             Query query = Query.query(Criteria.where("id").is(user.getId()));
  5.             Update update = new Update()
  6.                     .set("name", user.getName())
  7.                     .set("email", user.getEmail());
  8.             bulkOps.updateOne(query, update);
  9.         }
  10.         bulkOps.execute();
  11.     }
复制代码
3. 连接池优化

3.1 配置参数

  1. spring:
  2.   data:
  3.     mongodb:
  4.       uri: mongodb://localhost:27017/dbname
  5.       # 连接池配置
  6.       maxConnectionIdleTime: 60000
  7.       maxConnectionLifeTime: 300000
  8.       minConnectionsPerHost: 10
  9.       maxConnectionsPerHost: 100
复制代码
3.2 关键参数说明



  • maxConnectionIdleTime: 连接最大空闲时间
  • maxConnectionLifeTime: 连接最大生命周期
  • minConnectionsPerHost: 最小连接数
  • maxConnectionsPerHost: 最大连接数
3.3 核心参数

参数名说明默认值发起值maxSize最大连接数100根据并发量设置,一般50-200minSize最小连接数0发起为maxSize的10%-20%maxWaitTime最大等待时间120000ms根据业务容忍度设置maxIdleTime最大空闲时间0发起设置,如60000msmaxLifeTime连接最大生命周期0发起设置,如30分钟 3.4 发起配置值

根据不同场景的发起配置:
3.4.1 小型应用

  1. max-size: 50 # 较小的连接池
  2. min-size: 5 # 保持少量常开连接
  3. max-wait-time: 60000 # 1分钟等待时间
复制代码
3.4.2 中型应用

  1. max-size: 100 # 默认值适合大多数场景
  2. min-size: 10 # 保持10%的常开连接
  3. max-wait-time: 120000 # 2分钟等待时间
复制代码
3.4.3 大型应用

  1. max-size: 200 # 较大的连接池
  2. min-size: 20 # 保持更多常开连接
  3. max-wait-time: 180000 # 3分钟等待时间
复制代码
3.5 连接数盘算公式

保举的连接数盘算公式:
最大连接数 = ((核心数 *2) + 有效磁盘数) * 服务器数量
最小连接数 = 最大连接数 0.25
比方:


  • 4核CPU
  • 1个磁盘
  • 2台服务器
  • 盘算结果:((4 * 2) + 1) * 2 = 18 * 2 = 36 个连接
4 性能优化


  • 心跳检测

    • heartbeatFrequency: 设置为10-30秒
    • minHeartbeatFrequency: 最小心跳频率设置为500ms

  • 默认值说明:


  • maxSize=100 是MongoDB驱动的默认值
  • 这个默认值实用于大多数中小型应用
  • 不发起设置过大的连接数,会占用过多系统资源
4.1 读写分离



  • 对于读多写少的场景,考虑利用读写分离
  • 配置副本集,将读操作分发到从节点
5. 监控和诊断

5.1 性能监控



  • 利用 MongoDB Compass 监控数据库性能
  • 关注慢查询日记
  • 定期查抄索引利用情况
  • 索引掷中率
  • 索引大小增长
  • 查询响应时间
  • 写入性能影响
5.2 常见问题诊断



  • 利用 explain() 分析查询性能
  1. Query query = new Query(Criteria.where("field").is(value));
  2. mongoTemplate.getCollection("collection_name")
  3. .find(query.getQueryObject())
  4. .explain();
复制代码
6. 最佳实践

6.1 查询优化发起


  • 利用恰当的索引
  • 克制利用skip()进行深度分页
  • 利用投影只返回需要的字段
  • 合理利用批量操作
  • 克制大规模的in查询
6.2 性能优化发起


  • 合理配置连接池
  • 利用批量操作替换循环操作
  • 恰当利用缓存
  • 异步处置处罚大量数据
  • 定期监控性能指标
7. 常见问题排查

7.1 索引未被利用



  • 查抄索引是否正确创建
  • 确认查询条件是否匹配索引字段
  • 查看实行计划,确认索引利用情况
7.2 索引性能问题



  • 查抄索引大小是否合适
  • 评估是否需要所有创建的索引
  • 考虑利用复合索引替换多个单字段索引
8 工具保举



  • MongoDB Compass - 可视化索引管理
  • Mongo-Express - Web界面管理工具
  • Studio 3T - 专业MongoDB IDE
参考资源

官方文档



  • MongoDB索引文档
  • 索引策略
  • 索引最佳实践

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王國慶

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表