PostgreSQL

PostgreSQL 知识量:10 - 51 - 182

6.3 常用索引方法><

多列索引- 6.3.1 -

在 PostgreSQL 中,可以使用多列索引(复合索引)来对多个列进行索引。多列索引可以覆盖多个列,并提高查询性能。

创建多列索引的基本语法如下:

CREATE INDEX index_name ON table_name (column1, column2, ...);

其中,index_name 是索引的名称,table_name 是要创建索引的表的名称,column1, column2, ... 是要索引的列的名称。

例如,如果要创建一个多列索引,涵盖 column1 和 column2 列,可以使用以下语句:

CREATE INDEX idx_column1_column2 ON table_name (column1, column2);

这将创建一个名为 idx_column1_column2 的多列索引,涵盖 column1 和 column2 列。

唯一索引- 6.3.2 -

唯一索引用于确保索引列中的数据唯一性。唯一索引不允许在索引列中出现重复值。

创建唯一索引的基本语法如下:

CREATE UNIQUE INDEX index_name ON table_name (column1, column2, ...);

其中,index_name 是索引的名称,table_name 是要创建索引的表的名称,column1, column2, ... 是要索引的列的名称。

例如,如果要创建一个唯一索引,涵盖 column1 列,可以使用以下语句:

CREATE UNIQUE INDEX idx_column1 ON table_name (column1);

这将创建一个名为 idx_column1 的唯一索引,涵盖 column1 列。

如果尝试插入或更新数据,使得索引列中的值重复,PostgreSQL 将引发一个错误。这有助于确保数据的完整性和一致性。

需要注意的是,唯一索引与主键约束类似,但它们之间有一些区别。主键约束不仅确保数据的唯一性,还定义了表中的记录的唯一标识。如果一个表已经有一个主键约束,则不需要再创建一个唯一索引,因为主键约束已经提供了唯一性保证。

表达式索引- 6.3.3 -

表达式索引是一种特殊类型的索引,允许对列的表达式结果进行索引,而不仅仅是列本身。这可以用于提高基于函数或计算的查询性能。

创建表达式索引的基本语法如下:

CREATE INDEX index_name ON table_name (expression);

其中,index_name 是索引的名称,table_name 是要创建索引的表的名称,expression 是要索引的表达式。

例如,假设有一个名为 orders 的表,其中有一个名为 price 的列,想要根据价格的对数进行索引,以提高某些查询的性能。可以创建一个表达式索引,如下所示:

CREATE INDEX idx_log_price ON orders (ln(price));

这将创建一个名为 idx_log_price 的表达式索引,涵盖 price 列的对数计算结果。

需要注意的是,表达式索引只对基于表达式的查询条件有效。如果查询条件中没有使用表达式,则表达式索引将不会被使用。

部分索引- 6.3.4 -

部分索引(Partial Index)是 PostgreSQL 中的一个特性,允许创建一个仅包含满足特定条件的行的索引。这可以用于优化只针对特定范围的查询的性能。

创建部分索引的基本语法如下:

CREATE INDEX index_name ON table_name (column1, column2, ...) WHERE condition;

其中,index_name 是索引的名称,table_name 是要创建索引的表的名称,column1, column2, ... 是要索引的列的名称,condition 是满足条件的行所满足的条件。

例如,假设有一个名为 orders 的表,其中有一个名为 amount 的列,想要创建一个仅包含金额大于 100 的订单的索引。可以使用以下语句:

CREATE INDEX idx_orders_high_amount ON orders (amount) WHERE amount > 100;

这将创建一个名为 idx_orders_high_amount 的部分索引,仅涵盖 amount 列中金额大于 100 的行。

使用部分索引时,只有满足条件的行才会被包含在索引中。这可以减少索引的大小,并提高查询性能,因为索引只包含必要的行。但是,需要注意的是,如果查询条件不匹配部分索引的条件,则该索引可能不会被使用。

索引与排序- 6.3.5 -

B-tree索引在PostgreSQL中是默认的索引类型,它支持排序操作。当使用B-tree索引进行查询时,如果查询中包含ORDER BY子句,PostgreSQL可以利用索引的顺序直接返回排序后的结果,而不需要额外的排序操作。

相比之下,其他类型的索引,如hash、GiST、SP-GiST、BRIN等,通常不支持排序操作。当使用这些索引进行查询并包含ORDER BY子句时,PostgreSQL需要对查询结果集进行一次显式排序操作,以确保返回的查询结果是按照指定的顺序排列的。