索引
简介
索引是数据库中用于加速数据检索的一种数据结构,通过创建指向表中数据的指针,使得数据库可以快速定位和访问特定的行,而无需扫描整个表。索引类似于书籍的目录,帮助用户快速定位所需要的内容,从而显著提高查询性能。虽然索引可以提高数据访问速度,但同时也增加了插入、更新、和删除操作的处理时间。所以是否要为表创建索引、索引建立在哪些字段上,是创建索引前必须要考虑的问题。
索引类型
- Btree:使用一种类似于B+tree的结构来存储数据的键值,叶节点按键值顺序存储数据。适用于等值查询、范围查询、排序和分组的操作。
- UBtree:仅供Ustore表使用的多版本Btree索引,索引页面上包含事务信息,并能自主回收页面。Ubtree索引默认开启insertpt功能。
示例
- 单列索引
- 多列索引
- 唯一索引
- 表达式索引
表达式索引是一种基于计算表达式或函数结果创建的索引,而非直接基于表中的原始列。它允许对一些计算或转换后的值进行快速检索,适用于查询条件中包含函数或表达式的情况。
--创建表及插入数据。 gaussdb=# CREATE TABLE tb_test(c1 varchar,c2 varchar); gaussdb=# INSERT INTO tb_test VALUES ('AAa','AAA12'); gaussdb=# INSERT INTO tb_test VALUES ('ABa','AAA13'); gaussdb=# INSERT INTO tb_test VALUES ('AAc','AAA14'); --创建索引。 gaussdb=# CREATE INDEX idx_test_c1_lower ON tb_test(lower(c1)); --查询。 gaussdb=# SELECT * FROM tb_test WHERE lower(c1) = 'aac'; --删除表。 gaussdb=# DROP TABLE tb_test;
- 部分索引
部分索引仅对表中满足特定条件的数据建立索引,从而减少索引体积,提升写入的性能。
--创建表及插入数据。 gaussdb=# CREATE TABLE tb_users(uid varchar, name varchar, is_active boolean); gaussdb=# INSERT INTO tb_users VALUES('bc'||generate_series(1,100),'uname'||generate_series(1,100),true); gaussdb=# INSERT INTO tb_users VALUES('ac'||generate_series(1,50),'uname'||generate_series(1,50),false); --创建索引。 gaussdb=# CREATE INDEX idx_users_uid_act ON tb_users(uid) WHERE is_active = true; --查询时自动利用部分索引。 gaussdb=# SELECT * FROM tb_users WHERE uid = 'bc001' AND is_active = true; --删除表。 gaussdb=# DROP TABLE tb_users;
- 分区索引
--创建表。 gaussdb=# CREATE TABLE student(id int, name varchar(20)) PARTITION BY RANGE (id) ( PARTITION p1 VALUES LESS THAN (200), PARTITION pmax VALUES LESS THAN (MAXVALUE) ); --创建LOCAL分区索引不指定索引分区的名称。 gaussdb=# CREATE INDEX idx_student1 ON student(id) LOCAL; --查看索引分区信息,发现LOCAL索引分区数和表的分区数一致。 gaussdb=# SELECT relname FROM pg_partition WHERE parentid = 'idx_student1'::regclass; relname ------------- p1_id_idx pmax_id_idx (2 rows) --删除LOCAL分区索引。 gaussdb=# DROP INDEX idx_student1; --创建GLOBAL索引。 gaussdb=# CREATE INDEX idx_student2 ON student(name) GLOBAL; --查看索引分区信息,发现GLOBAL索引分区数和表的分区数不一致。 gaussdb=# SELECT relname FROM pg_partition WHERE parentid = 'idx_student2'::regclass; relname --------- (0 rows) --删除GLOBAL索引。 gaussdb=# DROP INDEX idx_student2; --创建LOCAL表达式索引,不指定索引分区的名称。 gaussdb=# CREATE INDEX idx_student3 ON student(lower(name)) LOCAL; --查看索引分区信息,发现LOCAL索引分区数和表的分区数一致。 gaussdb=# SELECT relname FROM pg_partition WHERE parentid = 'idx_student3'::regclass; relname ------------- p1_id_idx pmax_id_idx (2 rows) --删除LOCAL分区表达式索引。 gaussdb=# DROP INDEX idx_student3; --创建GLOBAL表达式索引。 gaussdb=# CREATE INDEX idx_student4 ON student(lower(name)) GLOBAL; --查看索引分区信息,GLOBAL表达式索引分区数和表的分区数不一致。 gaussdb=# SELECT relname FROM pg_partition WHERE parentid = 'idx_student4'::regclass; relname --------- (0 rows) --删除GLOBAL表达式索引。 gaussdb=# DROP INDEX idx_student4; --删除表。 gaussdb=# DROP TABLE student;