View a markdown version of this page

CREATE INDEX - Amazon Aurora DSQL

CREATE INDEX

CREATE INDEX 会定义一个新的索引。在 Aurora DSQL 中,创建索引始终是异步操作,因此必须指定 ASYNC 关键字。有关 Aurora DSQL 如何运行异步索引构建操作以及如何对构建操作进行监控的信息,请参阅 Aurora DSQL 中的异步索引

支持的语法

CREATE [ UNIQUE ] INDEX ASYNC [ [ IF NOT EXISTS ] name ] ON table_name ( { column_name | ( expression ) } [ NULLS { FIRST | LAST } ] [, ...] ) [ INCLUDE ( column_name [, ...] ) ] [ NULLS [ NOT ] DISTINCT ]

说明

CREATE INDEX 会在指定表的指定列上构建索引。索引主要用于增强数据库性能,但使用不当可能会导致性能下降。

您可以将索引的键字段指定为列名,也可以指定为使用括号括起来的表达式。您可以指定多个字段来创建多列索引。

索引字段可以是根据表行中的一个或多个列的值计算得出的表达式。使用此功能可以根据基本数据的某个转换来快速访问数据。例如,根据 upper(col) 计算的索引允许子句 WHERE upper(col) = 'JIM' 使用索引。

索引定义中使用的所有函数和运算符都必须不可变。也就是说,它们的结果必须只取决于其参数,绝不能取决于任何外部影响,例如另一个表的内容或当前时间。此限制可以确保已明确定义索引的行为。要在索引表达式中使用用户定义的函数,请务必在创建该函数时将函数标记为 IMMUTABLE

参数

UNIQUE

指示系统在创建索引时、数据已存在时以及在您每次添加数据时,检查表中是否存在重复值。如果尝试插入或更新数据会导致条目重复,则会生成错误。

IF NOT EXISTS

如果同名的关系已存在,不引发错误。在这种情况下,将发出通知。请注意,不能保证现有索引与应该已创建的索引相似。在指定 IF NOT EXISTS 时,必须提供索引名称。

INCLUDE

可选的 INCLUDE 子句指定要作为非键列包含在索引中的列的列表。您不能在索引扫描搜索限定条件中使用非键列,并且 Aurora DSQL 会出于索引强制执行的任何唯一性或排除约束目的而忽略该列。但是,仅索引扫描无需访问索引的相应表即可返回非键列的内容,因为这些内容可以直接在索引条目中可用。因此,添加非键列可以对原本无法使用仅索引扫描的查询执行仅索引扫描。

不支持将表达式作为包含的列,因为表达式不能在仅索引扫描中使用。

name

要创建的索引的名称。您不能在此处包含架构名称。Aurora DSQL 始终在与其父表相同的架构中创建索引。索引的名称必须与架构中任何其他关系(例如表、序列、索引或视图)的名称不同。如果省略名称,Aurora DSQL 会根据父表的名称和索引列名称,选择合适的名称。

table_name

要建立索引的表的名称(可选择使用架构限定名称)。

column_name

表中列的名称。

expression

基于表的一个或多个列的表达式。您通常必须使用括号编写该表达式,如语法中所示。但是,如果表达式采用函数调用的形式,则可以省略括号。

NULLS FIRST

指定 null 值排在非 null 值之前。

NULLS LAST

指定 null 值排在非 null 值之后。

NULLS DISTINCT
NULLS NOT DISTINCT

指定对于唯一索引,null 值是否被视为不同的值(即不相等)。默认情况下,null 值会被视为不同的值,因此唯一索引可以在一列中包含多个 null 值。

示例

在表 films 中的列 title 上创建唯一索引。

CREATE UNIQUE INDEX ASYNC title_idx ON films (title);

在表 films 中的列 title 上使用包含的列 directorrating 创建唯一索引。

CREATE UNIQUE INDEX ASYNC title_idx ON films (title) INCLUDE (director, rating);

在表达式 lower(title) 上创建索引,从而执行不区分大小写的高效搜索。

CREATE INDEX ASYNC ON films ((lower(title)));

本示例省略了索引名称,因此 Aurora DSQL 会选择名称,通常为 films_lower_idx

使用非默认的 null 值排序顺序创建索引。

CREATE INDEX ASYNC title_idx_nulls_low ON films (title NULLS FIRST);