赞
踩
之前的查询,因为没有建立索引,组合条件查询效率较低,而通过使用Phoenix,我们可以非常方便地创建二级索引。Phoenix中的索引,其实底层还是表现为HBase中的表结构。这些索引表专门用来加快查询速度。
创建语法:
CREATE INDEX 索引名称 ON 表名 (列名1, 列名2, 列名3...)
注意:创建表的时候指定了SALT_BUCKETS,是不支持本地索引的。
创建语法:
CREATE local INDEX 索引名称 ON 表名 (列名1, 列名2, 列名3...)
Phoenix提供了覆盖的索引,可以不需要在找到索引条目后返回到主表。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'
select
*
from
"MOMO_CHAT"."MSG"
where
substr("msg_time", 0, 10) = '2022-01-29'
and "sender_account" = '13514684105'
and "receiver_account" = '13647128512';
添加本地索引及函数索引
CREATE LOCAL INDEX LOCAL_IDX_MOMO_MSG ON MOMO_CHAT.MSG(substr("msg_time", 0, 10), "sender_account", "receiver_account");
会发现有以下异常:
这个时候需要修改hbase-site.xml
文件,支持索引预写日志编码
<!-- 支持索引预写日志编码 -->
<property>
<name>hbase.regionserver.wal.codec</name>
<value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCode
</property>
然后需要复制到phoenix这个目录下面一份
cp hbase-site.xml /apache-phoenix-4.13.1-HBase-1.3-bin/bin/
接着重启hbase
./stop-hbase.sh
./start-hbase.sh
重新执行下索引,发现成功了。
重新执行下这条sql,会发现查询效率提高了。
select
*
from
"MOMO_CHAT"."MSG"
where
substr("msg_time", 0, 10) = '2022-01-29'
and "sender_account" = '13514684105'
and "receiver_account" = '13647128512';
这个时候看下sql的执行计划,会发现走的是range scan,是刚才我们创建的本地索引。
explain select
*
from
"MOMO_CHAT"."MSG"
where
substr("msg_time", 0, 10) = '2022-01-29'
and "sender_account" = '13514684105'
and "receiver_account" = '13647128512';
删除索引
drop index LOCAL_IDX_MOMO_MSG on MOMO_CHAT.MSG;
select "msg_time" from "MOMO_CHAT"."MSG" where "sender_account" = '13514684105';
建立一个全局索引并且是覆盖索引
create index IDX_SENDER_ACCOUNT on MOMO_CHAT.MSG("sender_account") include ("id", "msg_time");
重新来一次搜索,发现速度快多了
explain select "msg_time" from "MOMO_CHAT"."MSG" where "sender_account" = '13514684105';
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。