---

title: MongoDB 分片与索引优化(Shard Key、复合索引与查询规划)

date: 2025-11-26

keywords:

  • Shard Key
  • 复合索引
  • 查询规划
  • 性能优化
  • explain

description: 选择合适的分片键与复合索引, 结合查询规划分析优化读写与分布, 并提供可重复的度量与验证流程。

tags:

  • MongoDB
  • NoSQL
  • Shard Key
  • explain
  • 复合索引
  • 性能优化
  • 数据与存储
  • 查询规划

categories:

  • 文章资讯
  • 技术教程

---

概述

合理的分片键可实现数据均衡分布与高并发扩展, 复合索引与查询过滤协同可降低扫描与排序成本。通过查询规划分析与执行统计, 可系统性验证优化成效。

关键实践与参数

  • 分片键选择: 高基数、写入均衡、查询可过滤
  • 热点避免: 时间序列场景使用哈希或复合键抵抗热点
  • 复合索引: 按查询过滤与排序字段有序设计
  • 覆盖查询: 减少回表, 降低 docsExamined
  • 规划分析: 使用 explain("executionStats") 观测执行

示例/配置/实现

sh.enableSharding("shop")
sh.shardCollection("shop.orders", { customerId: 1, createdAt: 1 })
db.orders.createIndex({ customerId: 1, status: 1, createdAt: -1 })
db.orders.createIndex({ createdAt: -1 })
db.orders.find({ customerId: 123, status: "PAID" }).sort({ createdAt: -1 }).limit(20).explain("executionStats")

验证

  • 执行统计: 记录 nReturned totalDocsExamined totalKeysExamined 与耗时, 目标降低扫描与提高命中
  • 分布均衡: 使用 chunkMetadatabalancerStatus 验证分片均衡与迁移吞吐
  • 写入性能: 对比无索引与复合索引下的批量写入与查询延迟
  • 排序代价: 验证覆盖索引时排序在索引内完成, 减少内存使用

注意事项

  • 分片键不可变更, 需在建库时审慎设计
  • 索引数量应控制在查询必要范围, 防止写入放大
  • 哈希分片降低范围查询效率, 需结合实际场景权衡
  • 定期回顾工作负载与查询模式, 根据数据演化维护索引

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部