当前位置:   article > 正文

HBase优化之Apache Phoenix二级索引_skip-scan-join table 0

skip-scan-join table 0

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

全局索引

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

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

本地索引

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

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

覆盖索引

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

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

函数索引

函数索引(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'
  • 1
  • 2
  • 3
  • 4

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

我们需要根据用户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里面存储的索引字段
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

查询数据

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

查看执行计划

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 ,表示走的是索引表
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

查看索引

0: jdbc:phoenix:node1:2181> !table
+------------+--------------+--------------+---------------+----------+------------+---------------------+
| TABLE_CAT  | TABLE_SCHEM  |  TABLE_NAME  |  TABLE_TYPE   | REMARKS  | TYPE_NAME  | SELF_REFERENCING_CO |
+------------
  • 1
  • 2
  • 3
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/656711
推荐阅读