1.配置
-
添加如下配置到HBase的HRegionserver节点的hbase-site.xml
<!-- phoenix regionserver 配置参数-->
<property>
<name>hbase.regionserver.wal.codec</name>
<value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
</property>
<property>
<name>hbase.region.server.rpc.scheduler.factory.class</name>
<value>org.apache.hadoop.hbase.ipc.PhoenixRpcSchedulerFactory</value>
<description>Factory to create the Phoenix RPC Scheduler that uses separate queues for index and metadata updates</description>
</property>
<property>
<name>hbase.rpc.controllerfactory.class</name>
<value>org.apache.hadoop.hbase.ipc.controller.ServerRpcControllerFactory</value>
<description>Factory to create the Phoenix RPC Scheduler that uses separate queues for index and metadata updates</description>
</property>
2.全局二级索引
- 创建全局索引时,会在HBase中建立一张新表
- 写数据要更新索引表,而索引表是分布在不同的数据节点上的,跨节点的数据传输带来了较大的性能消耗。适合读多写少的场景
2.1.创建单个字段的全局索引
CREATE INDEX my_index ON my_table (my_col);
'如果想查询的字段不是索引字段的话索引表不会被使用,也就是说不会带来查询速度的提升
2.2.创建携带其他字段的全局索引
CREATE INDEX my_index ON my_table (v1) INCLUDE (v2);
3.局部二级索引
-
索引数据和数据表的数据是存放在同一张表中(且是同一个Region)
-
适用于写操作频繁的场景
CREATE LOCAL INDEX my_index ON my_table (my_column);
4.局部和全局的选择
4.1. 两种索引的介绍
全局索引:会单独创建一个新的文件,默认是一个region,同时会采用默认的region split的切分规则;
局部索引:在原数据表插入数据,索引数据和数据表的数据是存放在同一张表中(且是同一个Region)。
4.2. 在需要创建索引时,我们是选择创建哪种索引呢?
创建索引以后,每次数据的改动
都需要更新索引表。
两种索引选择的规则如下:
'情况1':写操作频繁,则选择局部索引,因为数据和索引在同一张表的同一个region中,所以更新索引的数据就不需要跨节点,避免了在写操作的时候往不同服务器的索引表中写索引带来的额外开销;但是这种情况读数据时,因为索引和数据在一个文件中,读索引时效率就会变低
'情况2': 读操作频繁时,则选择全局索引,因为全局索引中可以直接定位到数据,效率高。