Phoenix二级索引覆盖索引与函数索引
Phoenix除了全局和本地索引外,还支持覆盖索引(Covered Index)和函数索引(Functional Index)。请说明这两种索引的工作原理、使用语法和优化效果。覆盖索引如何避免回表查询?
回答
古法程序员
1. 覆盖索引(Covered Index)
原理:将查询需要的非索引列冗余存储在索引表中,查询时只需扫描索引表,无需回查主表。
-- 普通全局索引:需回表
CREATE INDEX idx_age ON user(age);
-- 覆盖索引:将name一起存到索引表
CREATE INDEX idx_age_cov ON user(age) INCLUDE (name, email);
-- 查询 SELECT age, name FROM user WHERE age=25 无需回表
优化效果:
- 减少一次HBase Get操作(省去回表)
- 查询延迟降低50%-80%
- 适用:查询列固定的场景
2. 函数索引(Functional Index) 原理:在索引列上应用函数,查询时自动匹配函数表达式。
-- 对UPPER(name)建索引
CREATE INDEX idx_up_name ON user (UPPER(name));
-- 查询 WHERE UPPER(name)='TOM' 自动走索引
应用场景:
- 日期格式化:
TRUNC(create_date, 'DD') - 字符串函数:
SUBSTR(phone,1,3) - 类型转换:
CAST(price AS VARCHAR)
3. 最佳实践
- 覆盖索引中INCLUDE列不宜过多(建议≤5列),否则索引表膨胀
- 函数索引列支持组合索引
- 异步索引创建(ASYNC)可降低建索引时的写入阻塞
- 监控
SYSTEM.CATALOG表查看索引元数据