文章目录
- openGauss学习笔记-31 openGauss 高级数据管理-索引
- 31.1 语法格式
- 31.2 参数说明
- 31.3 示例
openGauss学习笔记-31 openGauss 高级数据管理-索引
索引是一个指向表中数据的指针。一个数据库中的索引与一本书的索引目录是非常相似的。
索引可以用来提高数据库查询性能,但是不恰当的使用将导致数据库性能下降。建议仅在匹配如下某条原则时创建索引:
- 经常执行查询的字段。
- 在连接条件上创建索引,对于存在多字段连接的查询,建议在这些字段上建立组合索引。例如,select * from t1 join t2 on t1.a=t2.a and t1.b=t2.b,可以在t1表上的a,b字段上建立组合索引。
- WHERE子句的过滤条件字段上(尤其是范围条件)。
- 经常出现在ORDER BY、GROUP BY和DISTINCT后的字段。
31.1 语法格式
-
单列索引
单列索引是一个只基于表的一个列上创建的索引。
CREATE INDEX [ [schema_name.]index_name ] ON table_name (column_name);
-
组合索引
组合索引是基于表的多列上创建的索引。
CREATE INDEX [ [schema_name.]index_name ] ON table_name (column1_name,column2_name,...);
-
唯一索引
指定唯一索引的字段不允许重复值插入。
CREATE UNIQUE INDEX [ [schema_name.]index_name ] ON table_name (column_name);
-
局部索引
在表的子集上构建索引,子集由一个条件表达式定义。
CREATE INDEX [ [schema_name.]index_name ] ON table_name (expression);
-
部分索引
部分索引是一个只包含表的一部分记录的索引,通常是该表中比其他部分数据更有用的部分。
CREATE INDEX [ [schema_name.]index_name ] ON table_name (column_name) [ WHERE predicate ]
-
删除索引
DROP INDEX index_name;
31.2 参数说明
-
UNIQUE
创建唯一性索引,每次添加数据时检测表中是否有重复值。如果插入或更新的值会引起重复的记录时,将导致一个错误。
目前只有B-tree索引支持唯一索引。
-
schema_name
模式的名称。
取值范围:已存在模式名。
-
index_name
要创建的索引名,索引的模式与表相同。
取值范围:字符串,要符合标识符的命名规范。
-
table_name
需要为其创建索引的表的名称,可以用模式修饰。
取值范围:已存在的表名。
-
column_name
表中需要创建索引的列的名称(字段名)。
如果索引方式支持多字段索引,可以声明多个字段。全局索引最多可以声明31个字段,其他索引最多可以声明32个字段。
-
expression
创建一个基于该表的一个或多个字段的表达式索引,通常必须写在圆括弧中。如果表达式有函数调用的形式,圆括弧可以省略。
表达式索引可用于获取对基本数据的某种变形的快速访问。比如,一个在upper(col)上的函数索引将允许WHERE upper(col) = 'JIM’子句使用索引。
在创建表达式索引时,如果表达式中包含IS NULL子句,则这种索引是无效的。此时,建议用户尝试创建一个部分索引。
-
WHERE predicate
创建一个部分索引。部分索引是一个只包含表的一部分记录的索引,通常是该表中比其他部分数据更有用的部分。例如,有一个表,表里包含已记账和未记账的定单,未记账的定单只占表的一小部分而且这部分是最常用的部分,此时就可以通过只在未记账部分创建一个索引来改善性能。另外一个可能的用途是使用带有UNIQUE的WHERE强制一个表的某个子集的唯一性。
取值范围:predicate表达式只能引用表的字段,它可以使用所有字段,而不仅是被索引的字段。目前,子查询和聚集表达式不能出现在WHERE子句里。
31.3 示例
创建表tpcds.ship_mode_t1。
openGauss=# CREATE SCHEMA tpcds;
openGauss=# CREATE TABLE tpcds.ship_mode_t1
(
SM_SHIP_MODE_SK INTEGER NOT NULL,
SM_SHIP_MODE_ID CHAR(16) NOT NULL,
SM_TYPE CHAR(30) ,
SM_CODE CHAR(10) ,
SM_CARRIER CHAR(20) ,
SM_CONTRACT CHAR(20)
) ;
在表tpcds.ship_mode_t1上的SM_SHIP_MODE_ID字段上创建单列索引。
openGauss=# CREATE UNIQUE INDEX ds_ship_mode_t1_index0 ON tpcds.ship_mode_t1(SM_SHIP_MODE_ID);
在表tpcds.ship_mode_t1上的SM_SHIP_MODE_SK字段上创建普通的唯一索引。
openGauss=# CREATE UNIQUE INDEX ds_ship_mode_t1_index1 ON tpcds.ship_mode_t1(SM_SHIP_MODE_SK);
在表tpcds.ship_mode_t1上SM_CODE字段上创建表达式索引。
openGauss=# CREATE INDEX ds_ship_mode_t1_index2 ON tpcds.ship_mode_t1(SUBSTR(SM_CODE,1 ,4));
在表tpcds.ship_mode_t1上的SM_SHIP_MODE_SK字段上创建SM_SHIP_MODE_SK大于10的部分索引。
openGauss=# CREATE UNIQUE INDEX ds_ship_mode_t1_index3 ON tpcds.ship_mode_t1(SM_SHIP_MODE_SK) WHERE SM_SHIP_MODE_SK>10;
删除已创建索引。
openGauss=# DROP INDEX tpcds.ds_ship_mode_t1_index2;
👍 点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!