二级索引分类
Phoneix的索引底层还是表现为HBase中的表结构(每建一个索引就回增加一个表),这些索引表专门用来加速查询速度.你 用索引表加快查询
- 读多写少:全局索引
- 读少写多:本地索引
索引可以理解成二叉树
1,全局索引:二叉树里只有RowKey的地址值.
- 针对整张表,在整个HBase集群中,都是有效的,索引数据会分布在全局
2,覆盖索引:二叉树不光有Rowkey,而且把你要查的数据完整信息都放在里面了,占用空间更大,不像全局索只存放地址值
- 将数据直接存放在索引中,直接查询索引值就可以将数据查询出来,避免再根据rowkey查询数据
CREATE INDEX my_index ON my_table (v1,v2) INCLUDE(v3)
3,本地索引:本地索引和数据是存放在一起的.(是在同一张表里,与列簇平行的那种)
- 索引数据和表数据存储在一起,方便高效查询.
4.函数索引
- 基于一个函数表达式来创建索引,例如:where substr(xx,0,10)…,就可以基于substr(xxx,0,10)建立索引
全局索引对本地表是没影响的(另起炉灶建了一张索引表),本地索引不一样,本地索引是整合在本地表里,会改变本地表的结构.
全局索引+覆盖索引
全局索引会单独创建一张HBase的表来保存索引数据,一般经常配合覆盖索引来使用.将要查询的列和索引列全部数据全部都保存在表中,这样可以有效避免查询索引之后还要去查询数据表,一次查询全部搞定.
-- 二、在phoenix中创建二级索引
-- 根据用户ID来查询订单的ID以及对应的支付金额
-- 建立一个覆盖索引,加快查询
create index IDX_USER_ID on ORDER_DTL(C1."user_id") include ("id", C1."money");
-- 删除索引
drop index IDX_USER_ID on ORDER_DTL;
-- 强制使用索引查询
explain select /*+ INDEX(ORDER_DTL IDX_USER_ID) */ * from ORDER_DTL where "user_id" = '8237476';
本地索引的补充
- 使用 create local index 索引名称 on 表名(列1, 列2)
- 本地索引对数据是有侵入性的,就是原先的数据会被编码处理,所以只要创建了本地索引,原先的数据就会隐藏起来
- 性能提升几十倍、上百倍
- 当drop掉索引后,数据又可以恢复回来
- 这些都是由Phoenix的协处理器来实现的
关于创建Phonix索引,但查询用不上的解释
下面截图文档的意思是说:有两种分区方式, 一 用RowKey来进行预分区,二指定Region的数量进行预分区 重点来了不可以在第二种方式创建的表的基础上,创建索引表