## 概述 合理的分片键可实现数据均衡分布与高并发扩展, 复合索引与查询过滤协同可降低扫描与排序成本。通过查询规划分析与执行统计, 可系统性验证优化成效。 ## 关键实践与参数 - 分片键选择: 高基数、写入均衡、查询可过滤 - 热点避免: 时间序列场景使用哈希或复合键抵抗热点 - 复合索引: 按查询过滤与排序字段有序设计 - 覆盖查询: 减少回表, 降低 `docsExamined` - 规划分析: 使用 `explain("executionStats")` 观测执行 ## 示例/配置/实现 ```javascript 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 }) ``` ```javascript db.orders.find({ customerId: 123, status: "PAID" }).sort({ createdAt: -1 }).limit(20).explain("executionStats") ``` ## 验证 - 执行统计: 记录 `nReturned` `totalDocsExamined` `totalKeysExamined` 与耗时, 目标降低扫描与提高命中 - 分布均衡: 使用 `chunkMetadata` 与 `balancerStatus` 验证分片均衡与迁移吞吐 - 写入性能: 对比无索引与复合索引下的批量写入与查询延迟 - 排序代价: 验证覆盖索引时排序在索引内完成, 减少内存使用 ## 注意事项 - 分片键不可变更, 需在建库时审慎设计 - 索引数量应控制在查询必要范围, 防止写入放大 - 哈希分片降低范围查询效率, 需结合实际场景权衡 - 定期回顾工作负载与查询模式, 根据数据演化维护索引

发表评论 取消回复