HBase优化之Apache Phoenix二级索引

索引分类
全局索引
本地索引
覆盖索引
函数索引

全局索引

全局索引适用于读多写少业务 当构建了全局索引时,Phoenix会拦截写入(DELETE、UPSERT值和UPSERT
SELECT)上的数据表更新,构建索引更新,同时更新所有相关的索引表,开销较大
全局索引一般和覆盖索引搭配使用,读的效率很高,但写入效率会受影响 SELECT查询中引用了其他非索引列,该索引是不会生效的

创建语法:
CREATE INDEX 索引名称 ON 表名 (列名1, 列名2, 列名3...)

本地索引

本地索引适合写操作频繁,读相对少的业务 当使用SQL查询数据时,Phoenix会自动选择是否使用本地索引查询数据
本地索引的数据是保存在一个影子列蔟中 本地索引查询即使SELECT引用了非索引中的字段,也会自动应用索引的

创建语法:
CREATE local INDEX 索引名称 ON 表名 (列名1, 列名2, 列名3...)

覆盖索引

Phoenix可以将关心的数据捆绑在索引行中,从而节省了读取时间的开销
例如,以下语法将在v1和v2列上创建索引,并在索引中包括v3列,也就是通过v1、v2就可以直接把数据查询出来

CREATE INDEX my_index ON my_table (v1,v2) INCLUDE(v3)

函数索引

函数索引(4.3和更高版本)可以支持在列上创建索引,还可以基于任意表达式上创建索引
当查询使用该表达式时,可以使用索引来检索结果,而不是数据表 例如,可以在UPPER(FIRST_NAME||‘
’||LAST_NAME)上创建一个索引,这样将来搜索两个名字拼接在一起时,索引依然可以生效

-- 创建索引
CREATE INDEX UPPER_NAME_IDX ON EMP (UPPER(FIRST_NAME||' '||LAST_NAME))
-- 以下查询会走索引
SELECT EMP_ID FROM EMP WHERE UPPER(FIRST_NAME||' '||LAST_NAME)='JOHN DOE'

索引示例一:创建全局索引 + 覆盖索引

我们需要根据用户ID来查询订单的ID以及对应的支付金额
创建索引

 create index IDX_USER_ID on ORDER_DTL(C1."user_id") include ("id", C1."money");


hbase(main):002:0> scan "IDX_USER_ID",{
   LIMIT => 1}
ROW                                              COLUMN+CELL                                                                                                                                 
 \x001274270\x003d2254bd-c25a-404f-8e42-2faa4929 column=C1:\x00\x00\x00\x00, timestamp=1599812839225, value=x                                                                                
 a629                                                                                                                                                                                        
 \x001274270\x003d2254bd-c25a-404f-8e42-2faa4929 column=C1:\x80\x0B, timestamp=1599812839225, value=\xC5\x9C@\x01                                                                            
 a629                                                                                                                                                                                        
1 row(s)
Took 0.1094 seconds

根据 user_id 查询的 id 和 money
INCLUDE 表示的是 索引表IDX_USER_ID里面存储的索引字段

查询数据

0: jdbc:phoenix:node1:2181> select "user_id", "id", "money" from ORDER_DTL where "user_id" = '8237476';
+----------+---------------------------------------+---------+
| user_id  |                  id                   |  money  |
+----------+---------------------------------------+---------+
| 8237476  | 2909b28a-5085-4f1d-b01e-a34fbaf6ce37  | 9390.0  |
+----------+---------------------------------------+---------+
1 row selected (0.042 seconds)

查看执行计划

0: jdbc:phoenix:node1:2181> explain select "user_id", "id", "money" from ORDER_DTL where "user_id" = '8237476';
+--------------------------------------------------------------------------------------------------------+
|                                                  PLAN                                                  |
+--------------------------------------------------------------------------------------------------------+
| CLIENT 10-CHUNK PARALLEL 10-WAY ROUND ROBIN RANGE SCAN OVER IDX_USER_ID [0,'8237476'] - [9,'8237476']  |
+--------------------------------------------------------------------------------------------------------+
1 row selected (0.035 seconds)

从中可以看到 scan 的是 IDX_USER_ID ,表示走的是索引表

查看索引

0: jdbc:phoenix:node1:2181> !table
+------------+--------------+--------------+---------------+----------+------------+---------------------+
| TABLE_CAT  | TABLE_SCHEM  |  TABLE_NAME  |  TABLE_TYPE   | REMARKS  | TYPE_NAME  | SELF_REFERENCING_CO |
+------------
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值