Phoenix 表 和 二级索引 的 HBase 底层原理

1. 表的底层存储

    每一张Phoenix表都会对应一张HBase表, 主键key就是HBase的rowkey, 如果有多个主键, 则拼接起来作为HBase的rowKey, Phoenix的其他列默认位于同一HBase列族 下的列.

测试情况如下:

 创建表:

create table PHOENIX660000.test_key4(
A varchar not null,
B varchar not null,
C varchar,
D varchar,
f varchar,
g varchar,
h bigint,
i bigint,
constraint dos_pk primary key(A, B)

);

因为在HBase底层只有字符串类型正常显示, 其他类型都是以十六进制的形式显示的, 所以这里的字段我大多都用的字符串

插入数据:

upsert into PHOENIX660000.test_key4 values('aa', 'bb', 'cc', 'dd', 'ff', 'gg', 123,  456);


上图中就可以看出: 

    (1). rowKey就是 Phoenix 多个主键的拼接

    (2). 只有一个列族, 列族中的列就是Phoenix的非主键列


2. 二级索引的底层存储

(1) 为什么要创建二级索引?

    因为Hbase查询数据, 只有查询条件是rowKey的时候才是最快的, 其他条件查询会进行全表扫描, 比较慢, 所以HBase的精髓就是rowKey的设计, 而Hbase的rowKey则是Phoenix的主键(如果是多个主键, 则拼接, 见上文), 所以Phoenix想要保证实时查询, SQL中where条件必须是主键, 而业务需求比较多变, 主键一般都是不够用的, 所以产生了二级索引, 使得where条件可以判断其他字段, 而不影响速度.

(2) 二级索引的原理

 创建索引:

    create index index_test_key4 on PHOENIX660000.test_key4 (c, d, h) include(f, g, i);

以上面的创建索引语句为例进行说明:

    创建二级索引实际上就是创建一个新表 , 它将原始表PHOENIX660000.test_key4中的 c, d, h三列外加原始表主键作为主键, f, g, i 作为普通列, 新建了一个表 PHOENIX660000.index_test_key4.

!desc PHOENIX660000.index_test_key4;


上图可以看到二级索引表有5个主键, 三个二级索引c d h 和两个原始表主键a b


(3). 二级索引的Hbase底层存储

    插入数据:

   upsert into PHOENIX660000.test_key4 values('aa', 'bb', 'cc', 'dd', 'ff', 'gg', 123,  456);

    scan Hbase表的结果:

    


可以看到, rowkey确实是 c d h 和 a b 的拼接, 列族中的列则是 f g i

所以二级索引的正确创建姿势是:

create index 二级索引表名 on 原始数据表名(二级索引主键, where条件中的字段) include(普通字段, select 后面跟的需要显示的字段);

猜你喜欢

转载自blog.csdn.net/yuanhaiwn/article/details/80630138