请说明在 HBase 中为表设计二级索引的常用方案有哪些,并解释这些二级索引是如何帮助加快查询速度的。
考察说明
考查对 HBase 二级索引实现机制及查询加速原理的理解。
回答思路
- 【回答框架 1】二级索引是除行键主索引外的附加索引,用于按非行键列快速定位数据。HBase 本身只支持基于行键的查询,直接按其他列查询需全表扫描,性能差。
- 【回答框架 2】常用方案包括:1)自定义二级索引表,即维护一张索引表,以索引列为行键,原表行键为值,查询时先查索引表得行键,再查原表;2)使用协处理器(Coprocessor)在写入时自动同步更新索引表,如 Phoenix 的索引实现;3)采用外部索引组件,如 Elasticsearch 或 Solr,将索引列数据同步过去,查询走外部系统。
- 【回答框架 3】加速原理:二级索引将查询从全表扫描(O(n))变为两次点查(O(1) 或 O(log n)),先定位索引行键,再通过行键直接获取数据,大幅减少扫描数据量。
- 【回答框架 4】需注意索引一致性维护,写入原表时要同步更新索引,保证数据一致;索引表本身也会占用存储和写入开销,需权衡读写性能。
- 【回答框架 5】设计时可根据查询模式选择索引列组合,支持等值查询和范围查询;对于高并发写入场景,coprocessor 方案可能增加写入延迟,外部索引存在同步延迟风险。
- 【关键点 1】二级索引本质是额外映射表,用索引列做行键加速按列查询。
- 【关键点 2】实现方式有自定义索引表、协处理器自动索引、外部索引组件三种。
- 【关键点 3】查询加速通过先索引点查后行键点查,避免全表扫描。
- 【关键点 4】索引维护需保证一致性,并在读写性能间取舍。
- 【易错点 1】不能直接说二级索引能保证数据强一致,需额外处理索引同步失败或延迟问题。
- 【易错点 2】避免忽略索引写入带来的额外存储和写放大开销。
- 【易错点 3】不要将所有非行键查询都套用二级索引,需结合实际查询频率设计。