---
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")
验证
- 执行统计: 记录
nReturnedtotalDocsExaminedtotalKeysExamined与耗时, 目标降低扫描与提高命中 - 分布均衡: 使用
chunkMetadata与balancerStatus验证分片均衡与迁移吞吐 - 写入性能: 对比无索引与复合索引下的批量写入与查询延迟
- 排序代价: 验证覆盖索引时排序在索引内完成, 减少内存使用
注意事项
- 分片键不可变更, 需在建库时审慎设计
- 索引数量应控制在查询必要范围, 防止写入放大
- 哈希分片降低范围查询效率, 需结合实际场景权衡
- 定期回顾工作负载与查询模式, 根据数据演化维护索引

发表评论 取消回复