分片与二级索引
索引是数据库查询优化的核心。在分片环境下,索引的设计更加复杂——本地索引和全局索引各有优劣,需要根据业务场景选择。
本地索引:每个分片维护自己的索引
本地索引(Local Index)是指每个分片独立维护自己的索引,索引和数据在同一个分片内。
原理
优势
- 写入性能高:索引和数据在同一分片,单机事务即可保证一致性
- 实现简单:每个分片像单机数据库一样管理索引
- 无跨分片协调:不需要额外的索引同步机制
局限
无法高效支持跨分片查询的索引:
实现示例
本地索引查询]
全局索引:独立索引服务
全局索引(Global Index)维护跨分片的全局索引,索引和数据可能不在同一分片。
原理
优势
- 跨分片查询高效:通过全局索引直接定位到相关分片
- 支持更多查询模式:不依赖分片键的查询也能高效
局限
- 写入放大:数据变更时需要同时更新全局索引
- 一致性挑战:数据写入和索引更新需要协调
- 实现复杂:需要单独的索引服务或存储
实现示例
全局索引服务]
索引同步延迟
全局索引的同步延迟是必须面对的问题。
同步方式
同步写入:数据写入和索引更新在同一事务中。延迟低,但写入性能受影响。
同步索引更新]
异步写入:数据先写入,索引更新异步进行。写入性能好,但存在索引延迟。
异步索引更新]
延迟影响
索引设计原则
选择合适的索引类型
分片键查询为主:使用本地索引即可,无需全局索引。
非分片键查询多:考虑全局索引或热点数据预聚合。
复合场景:分片键查询用本地索引,非分片键查询用全局索引。
索引与分片键的关系
索引数量控制
索引不是越多越好。每个索引都会增加写入开销和存储成本。
建议:
- 核心查询字段建立索引
- 高频组合查询考虑复合索引
- 定期评估索引使用率,删除无用的索引
索引使用率监控]
二级索引实现方案对比
常见误区
误区一:所有字段都建索引
索引会降低写入性能,增加存储成本。只对高频查询字段建索引。
误区二:全局索引能解决所有查询问题
全局索引引入写入开销和一致性问题。应该评估是否真的需要。
误区三:索引和分片策略无关
索引设计应该配合分片策略。如果某个查询特别频繁,可以考虑调整分片键。
延伸思考
二级索引是分片系统的重要扩展。好的索引设计应该:
- 理解查询模式:哪些查询频繁、哪些查询偶尔
- 选择合适类型:本地索引还是全局索引
- 控制索引数量:避免过度索引
- 监控索引效果:定期评估索引使用率
索引设计的核心是权衡——查询性能 vs 写入性能、一致性 vs 可用性。根据业务特点找到平衡点。