

# `CREATE INDEX`
<a name="create-index-syntax-support"></a>

`CREATE INDEX` 会定义一个新的索引。在 Aurora DSQL 中，创建索引始终是异步操作，因此必须指定 `ASYNC` 关键字。有关 Aurora DSQL 如何运行异步索引构建操作以及如何对构建操作进行监控的信息，请参阅 [Aurora DSQL 中的异步索引](working-with-create-index-async.md)。

## 支持的语法
<a name="create-index-supported-syntax"></a>

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

## 说明
<a name="create-index-description"></a>

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

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

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

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

## 参数
<a name="create-index-parameters"></a>

**`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 值。

## 示例
<a name="create-index-examples"></a>

在表 `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);
```