Apache Phoenix 索引index

在海量数据背景下,查询数据快速返回是典型的应用场景。

在phoenix数据表基础之上创建索引,能够大幅提高数据的查询效率。

Phoenix支持的索引有三个类型,分别是覆盖索引全局索引本地索引

覆盖索引Covered Index

覆盖索引要求查询语句中的条件字段、查询字段都必须创建过索引,否则就会触发“全局扫描”(full table scan)

创建语法:create index coverindex user_index on user (name) include (age);
因此它的特点是:只需要通过索引就能返回所要查询的数据 。

全局索引Global indexes

global是默认的索引格式。

全局索引适用于多读少写的场景,在写操作上会给性能带来极大的开销,因为所有的更新和写操作(DELETE,UPSERT VALUES和UPSERT SELECT)都会引起索引的更新,在读数据时,Phoenix将通过索引表来达到快速查询的目的。如;

create  index  userid_index  on  user  (userid);

它有一个缺陷,如果查询语句中的条件字段或查询字段不是索引字段,就会触发全表扫描。例如:

select userid,name  from  user  where  userid='8960321

解决办法有两个:
一是和覆盖索引一样,创建索引时把查询的相关字放入段include来。

create  index  userid_index  on  user  (userid)  include  (name );

二是强制使用索引:

select /*+ index(user,userid_index) */ name  FROM  user  userid='8960321;

制使用索引的查询语句会导致二次检索数据表,第一次检索是去索引表中查找符合userid='8960321’的数据,此时候发现 name 字段并不在索引字段中,会去user 表中第二次扫描name。因此只有当用户明确知道name符合检索条件的数据较少的时候才适合使用,否则会造成全表扫描,对性能影响较大。

本地索引Local Indexing

与Global Indexing不同,本地索引适用于写多读少的场景,当使用Local Indexing的时候即使查询的所有字段都不在索引字段中时也会用到索引进行查询,Phoneix在查询时会自动选择是否使用本地索引(这是由Local Indexing自动完成的)。

create  local  index  user_Index  on  user  (userid,name);

索引常用操作

查看表索引

 !index "harve_user";

删除索引

drop index user_Index  on  user;

索引有序性

创建的索引字段的顺序,与查询语句条件字段的顺序,两者之间的对应关系对索引是否生效有较大影响。
查询语句条件字段的顺序尽量与索引的顺序相同。索引的首字段在查询条件中尽量第一个出现。

测试

创建测试表

create table if not exists testdata(
A bigint not null,
B bigint,
C bigint,
D bigint,
E bigint,
F bigint,
G bigint,
H bigint,
I bigint
CONSTRAINT testdata PRIMARY KEY(A));

加载一千万数据

python /export/servers/phoenix-4.14.0-cdh5.14.2/bin/psql.py -t TESTDATA  node01 TestDatas.csv

创建索引

CREATE INDEX testdataindex  ON testdata (B,C,D,E,F) 

查询效率对比

建索引SQL无索引有索引
无索引select count(*) from TESTDATA WHERE
B>1000 AND C<9000 AND D>800 AND E>3000 AND F<9876;
29.405
29.305
28.94
10.332
9.752
9.718
无索引select count(*) from TESTDATA WHERE
B>1000 AND C<9000 AND D>800;
25.174
24.948
24.893
8.326
8.635
8.818
无索引select count(*) from TESTDATA WHERE
B>1000 AND E>3000 AND F<9876;
26.069
24.543
24.482
7.58
7.36
7.28
无索引select count(*) from TESTDATA WHERE
D>800 AND E>3000 AND F<9876;
25.535
25.796
25.412
9.577
9.758
9.286
无索引select count(*) from TESTDATA WHERE
C<9000 AND D>800 AND E>3000;
25.313
25.415
25.399
9.551
9.528
9.334
无索引select count(*) from TESTDATA WHERE B>1000;20.024
20.04
19.804
4.879
4.814
4.772
无索引select count(*) from TESTDATA WHERE D>1000;21.09
20.736
20.991
7.406
7.893
7.79
无索引select count(*) from TESTDATA WHERE F>1000;21.198
21.34
21.015
7.576
7.583
7.507
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值