HBase Phoenix二级索引原理
请详细介绍Phoenix在HBase上实现二级索引的原理。Phoenix支持的全局索引(Global Indexing)和本地索引(Local Indexing)有什么区别?各自适用什么场景?如何选择?
回答
专业代码师
Phoenix通过协处理器(Coprocessor)在HBase上实现二级索引:
1. 核心原理
- 利用HBase的RegionObserver和Endpoint协处理器
- 写入数据时自动维护索引表
- 查询时通过索引表定位RowKey,避免全表扫描
2. 全局索引(Global Indexing)
CREATE INDEX idx_name ON table (col) INCLUDE (other_col);
- 特点:创建独立的HBase索引表
- 写开销:每次写入需同步更新索引表(写入放大)
- 读性能:索引表命中后直接定位数据行,查询延迟低
- 限制:查询必须包含所有索引列,否则走全表扫描
- 适用:读多写少场景,查询条件固定包含索引列
3. 本地索引(Local Indexing)
CREATE LOCAL INDEX idx_local ON table (col);
- 特点:索引数据与原始数据存储在同一Region上
- 写开销:索引与数据同Region,写入放大较小
- 读性能:需扫描多个Region,延迟高于全局索引
- 优势:查询条件可不包含所有索引列仍命中
- 适用:写多读少场景,查询条件不固定
4. 对比 | 维度 | 全局索引 | 本地索引 | |------|---------|---------| | 索引表 | 独立表 | 同Region内 | | 写入性能 | 较差(2次写入) | 较好(1次写入) | | 查询性能 | 优秀(精确查找) | 一般(扫描) | | 空间占用 | 较高(副本) | 较低 | | 事务支持 | 弱 | 强(同一Region) |
5. 选择建议
- 读密集 → 全局索引
- 写密集/写入峰值高 → 本地索引
- 查询条件固定 → 全局索引
- 查询灵活多变 → 本地索引