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 DISTINCTNULLS NOT DISTINCT-
指定对于唯一索引,null 值是否被视为不同的值(即不相等)。默认情况下,null 值会被视为不同的值,因此唯一索引可以在一列中包含多个 null 值。
示例
在表 films 中的列 title 上创建唯一索引。
CREATE UNIQUE INDEX ASYNC title_idx ON films (title);
在表 films 中的列 title 上使用包含的列 director 和 rating 创建唯一索引。
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);