赞
踩
索引分类
全局索引
本地索引
覆盖索引
函数索引
全局索引
全局索引适用于读多写少业务 当构建了全局索引时,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 |
+------------
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。