CodeWalk

Phoenix二级索引覆盖索引与函数索引

作者:古法程序员 · 2026-05-30 12:55

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 表查看索引元数据