在海量数据背景下,查询数据快速返回是典型的应用场景。在phoenix数据表基础之上创建索引,能够大幅提高数据的查询效率。Phoenix支持的索引有三个类型,分别是覆盖索引、全局索引、本地索引。
A: 覆盖索引Covered Index
覆盖索引要求查询语句中的条件字段、查询字段都必须创建过索引,否则就会触发“全局扫描”(full table scan) 创建语法:create index coverindex user_index on user (name) include (age); 因此它的特点是:只需要通过索引就能返回所要查询的数据 。
B: 全局索引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符合检索条件的数据较少的时候才适合使用,否则会造成全表扫描,对性能影响较大。
C: 本地索引Local Indexing
与Global Indexing不同,本地索引适用于写多读少的场景,当使用Local Indexing的时候即使查询的所有字段都不在索引字段中时也会用到索引进行查询,Phoneix在查询时会自动选择是否使用本地索引(这是由Local Indexing自动完成的)。
create local index user_Index on user (userid,name);
D: 索引常用操作
查看表索引
!index "harve_user";
删除索引
drop index user_Index on user;
E: 索引有序性
创建的索引字段的顺序,与查询语句条件字段的顺序,两者之间的对应关系对索引是否生效有较大影响。
查询语句条件字段的顺序尽量与索引的顺序相同。索引的首字段在查询条件中尽量第一个出现。
测试创建测试表
代码语言:javascript复制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)
查询效率对比
本次的分享到这里就结束了,受益的下伙伴或对大数据技术感兴趣的朋友记得关注小菌哟!