HGDB索引关键字include

Posted 瀚高PG实验室

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HGDB索引关键字include相关的知识,希望对你有一定的参考价值。

目录
环境
文档用途
详细信息

环境
系统平台:Linux x86-64 Red Hat Enterprise Linux 7
版本:4.5
文档用途
介绍瀚高数据库安全版4.5中新增的include关键字

详细信息
HGDB中一条查询语句返回多列记录时,如果索引包含全部的返回列则不用回表获取数据,例如:

select c1,c2,c3 from t1 where c1=10;
如果索引包含c1、c2、c3,则会用到index only scan;除此之外HGDB中还有一种方法可以实现类似效果,即include子句。

include即在索引中放入额外属性内容,搜索时不需要回表,例如:

create index idx_t2_1 on t2 (id,c1,c2,c3,info,crt_time);
第一种则是include index;

第二个创建索引的语句是我们比较常见的多列索引;

索引1,KEY是ID,在叶子节点中,存入KEY与(c1,c2,c3,info,crt_time)的内容。

索引2,KEY是(id,c1,c2,c3,info,crt_time)在所有节点中储存的都是所有字段的值,比索引1要重,包括空间、索引维护、更新等。

下面比较下三种索引:普通索引,多列索引,includes index三者的读写性能

创建实验环境

create table t1 (id int, c1 int, c2 int, c3 int, info text, crt_time timestamp);
create table t2(like t1);
create table t3(like t1);
create index idx_t1_1 on t1 (id) include(c1,c2,c3,info,crt_time);
create index idx_t2_1 on t2 (id,c1,c2,c3,info,crt_time);
create index idx_t3_1 on t3(id);
写入10000000条数据

1、include index

insert into t1 select (1000*random())::int,1,1,1,‘test’,now() from generate_series(1,2000000);
2、多列索引

insert into t2 select (1000*random())::int,1,1,1,‘test’,now() from generate_series(1,2000000);
3、普通索引

insert into t3 select (1000*random())::int,1,1,1,‘test’,now() from generate_series(1,2000000);
查询性能对比

1、include index

explain (analyze,verbose,timing,costs,buffers) select id,c1,c2,c3,info,crt_time from t1 where id=1;
image.png

2、多列索引

explain (analyze,verbose,timing,costs,buffers) select id,c1,c2,c3,info,crt_time from t2 where id=1;
image.png

3、普通索引

explain (analyze,verbose,timing,costs,buffers) select id,c1,c2,c3,info,crt_time from t3 where id=1;
image.png

总结:index include技术可以提高整体性能,目前只支持btree和gist索引

更多详细信息请登录【瀚高技术支持平台】查看https://support.highgo.com/#/index/docContentHighgo/da6369c504d7275e

以上是关于HGDB索引关键字include的主要内容,如果未能解决你的问题,请参考以下文章

HGDB中如何在线重建索引

mysqlsql优化篇-关键字与索引

mysqlsql优化篇-关键字与索引

mysqlsql优化篇-关键字与索引

MySQL的btree索引和hash索引&聚集索引

急急急!!!索引或主关键字不能包含一个空(Null)值