HBase全局索引与本地索引选型
在设计HBase Phoenix索引时,全局索引和本地索引的内部存储结构有何不同?索引数据如何与主表数据关联?为什么全局索引查询快但写入慢?请从Region分布和数据本地性角度深入分析。
回答
孤独的心
1. 内部存储结构差异
全局索引
- 索引表独立于主表,RowKey = 索引列值 + 原RowKey
- 索引表Region分布与主表无关,独立进行Region分裂
- 查询流程:1) 查索引表得原RowKey → 2) 查主表得完整行
- 两阶段查询,但每个阶段都是精确Get,速度很快
本地索引
- 索引数据写在同一Region的索引区域(非独立表)
- RowKey = Region起始Key + 索引列值 + 原RowKey
- 索引与主数据共享Region,保证数据本地性
- 查询时需扫描对应Region的所有索引数据
2. 为什么全局索引写入慢
- 双Region写入:数据写入主表Region R1,索引写入索引表Region R2(可能不同机器)
- 跨节点网络开销:写入放大2倍
- 分布式事务:主表和索引表需保证一致性(Phoenix通过MVCC实现)
- Region分裂:索引表也可能触发分裂增加延迟
3. 为什么本地索引写快读慢
- 写快:索引与主数据同Region,数据本地性保证单次网络往返
- 读慢:索引数据分散在各Region中,查询需扫描所有Region的索引区域
- 无索引表负载均衡开销
4. 实际场景建议
- 全局索引:订单查询(按订单号精确查)
- 本地索引:用户行为日志(按时间范围扫描,查询条件灵活)
- 混合使用:核心查询列建全局索引,辅助查询列建本地索引