赞
踩
在海量数据背景下,查询数据快速返回是典型的应用场景。
在phoenix数据表基础之上创建索引,能够大幅提高数据的查询效率。
Phoenix支持的索引有三个类型,分别是覆盖索引、全局索引、本地索引。
覆盖索引要求查询语句中的条件字段、查询字段都必须创建过索引,否则就会触发“全局扫描”(full table scan)
创建语法:create index coverindex user_index on user (name) include (age);
因此它的特点是:只需要通过索引就能返回所要查询的数据 。
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符合检索条件的数据较少的时候才适合使用,否则会造成全表扫描,对性能影响较大。
与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 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。