---
title: "CREATE INDEX - OceanBase 数据库 V4.3.4 | OceanBase 文档中心"
description: CREATE INDEX 描述 该语句用来创建索引。索引是创建在表上的，对数据库表中一列或多列的值进行排序的一种结构。其作用主要在于提高查询的速度，降低数据库系统的性能开销。 OceanBase 数据库当前版本支持的索引类型包含唯一索引和非唯一索引，创建索引时可以通过 STORING(column_name,...)…
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.3.4

# CREATE INDEX

更新时间：2024-11-29 23:00:00

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.3.4/zh-CN/700.reference/500.sql-reference/100.sql-syntax/200.common-tenant-of-mysql-mode/600.sql-statement-of-mysql-mode/2200.create-index-of-mysql-mode.md)  

## 描述

该语句用来创建索引。索引是创建在表上的，对数据库表中一列或多列的值进行排序的一种结构。其作用主要在于提高查询的速度，降低数据库系统的性能开销。

OceanBase 数据库当前版本支持的索引类型包含唯一索引和非唯一索引，创建索引时可以通过 `STORING(column_name,...)` 指定索引表上的冗余列。索引表的冗余列除了包含用户指定添加的列外，还会自动添加上主键表的主键列（如果无主键表则包含 Hidden PK），存储额外的列在索引中可以为数据库优化器提供更多的选择。

#### 说明

在 OceanBase 数据库 MySQL 模式下，如果删除表中的所有索引列，则所创建的索引失效。

## 权限要求

执行 `CREATE INDEX` 语句创建索引需要当前用户至少拥有对应对象的 INDEX 权限。有关 OceanBase 数据库权限的详细介绍，请参见 [MySQL 模式下的权限分类](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001576703)。

## 语法

```sql
CREATE [hint_options] [SPATIAL | UNIQUE] INDEX [IF NOT EXISTS] index_name
    [USING BTREE] ON table_name (sort_column_key [, sort_column_key... ])
    [index_option...] [partition_option] [index_column_group_option]

sort_column_key:
      column_name [(integer)] [ASC] [ID id]
    | (index_expr) [ASC] [ID id]

index_option:  
      GLOBAL
    | LOCAL
    | BLOCK_SIZE integer
    | COMMENT STRING_VALUE
    | STORING (column_name [, column_name...])
    | WITH_ROWID
    | WITH PARSER STRING_VALUE
    | index_using_algorithm
    | visibility_option
    | DATA_TABLE_ID data_table_id
    | INDEX_TABLE_ID index_table_id
    | VIRTUAL_COLUMN_ID virtual_column_id
    | MAX_USED_PART_ID used_part_id

index_column_group_option：
    WITH COLUMN GROUP([all columns, ]each column)

```

## 参数说明

| 参数项 | 描述 |
| --- | --- |
| hint_options | 指定 Hint 选项，为可选项。目前仅支持使用 parallel，如 `/*+ parallel(10) */`。 |
| [SPATIAL \| UNIQUE] | 可选项，指定索引的类型。   - `SPATIAL` 关键字用于创建空间索引。 - `UNIQUE` 关键字用于创建唯一索引。 |
| IF NOT EXISTS | 用于指示如果索引已经存在，则不进行创建。创建索引时，如果索引存在且没有指定 `IF NOT EXISTS`，则会报错。 |
| index_name | 指定待创建的索引名称。 |
| USING BTREE | 可选项，表示创建索引时使用 B-tree 索引结构。   #### 说明    目前仅支持指定为 `USING BTREE`。 |
| table_name | 指定要在其上创建索引的表，可以直接指定表的名字，也可使用 `schema_name.table_name` 格式指定表名和表所属的数据库名。 |
| sort_column_key | 指定一个排序列的键，创建索引时可以指定多个排序列，多个排序列使用英文逗号（`,`）分开，详细介绍可参见下文 [sort_column_key](#sort_column_key)。 |
| index_option | 指定索引选项，创建索引时可以指定多个索引选项，多个索引选项使用英文空格分开，详细介绍可参见下文 [index_option](#index_option)。 |
| partition_option | 指定创建索引分区的选项，支持指定哈希分区、键分区、范围分区、列表分区以及外部表分区。 |
| index_column_group_option | 指定索引选项。详细介绍可参见下文 [index_column_group_option](#index_column_group_option)。 |

### sort_column_key

- `column_name [(integer)] [ASC] [ID id]`：表示指定一个列名作为排序键。

     - `column_name`：表示要排序的列名。
     - `integer`：可选项，表示排序键的长度限制。
     - `ASC`：可选项，表示按升序排序，目前暂不支持降序（DESC）排列。
     - `ID id`：可选项，表示排序键的 ID 号。

  例如，在名为 `t3` 的表上创建一个名为 `index3` 的索引，并指定该索引在 `c1` 列上按升序进行排序。

  ```sql
  CREATE INDEX index3 ON t3 (c1 ASC);

  ```
 - `(index_expr) [ASC] [ID id]`：表示指定一个索引表达式作为排序键。索引表达式可以使用表达式或函数来定义。它可以包含以下选项：

     - `(index_expr)`：表示索引表达式，且允许是布尔表达式，例如 `c1=c1`。OceanBase 数据库当前版本禁止创建生成列上的函数索引。函数索引所支持的表达式参见 [函数索引支持的系统函数列表](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001576030)。
     - `ASC`：可选项，表示按升序排序，目前暂不支持降序（DESC）排列。
     - `ID id`：可选项，表示排序键的 ID 号。

  例如，在名为 `t4` 的表上创建一个名为 `index4` 的索引，指定 `c1+c2` 作为索引表达式，并按升序进行排序。

  ```sql
  CREATE INDEX index4 ON t4 ((c1 + c2) ASC);

  ```

创建索引时可指定多个排序列，多个排序列使用英文逗号(`,`)分开。例如，在名为 `t5` 的表上创建一个名为 `index5` 的索引，并指定使用 `c1` 列和 `c2+c3` 表达式作为索引的排序键。

```sql
CREATE INDEX index5 ON t5 (c1, (c2+c3));

```

### index_option

- `GLOBAL`：表示创建全局索引。
 - `LOCAL`：表示创建局部索引。
 - `BLOCK_SIZE integer`：指定索引块的大小，即每个索引块中的字节数。
 - `COMMENT STRING_VALUE`：为索引添加注释。
 - `STORING (column_name [, column_name...])`：指定要存储在索引中的列，多个列使用英文逗号（`,`）分开。
 - `WITH_ROWID`：创建包含行标识符的索引。
 - `WITH PARSER STRING_VALUE`：指定索引所需的解析器。
 - `index_using_algorithm`：指定索引所使用的算法。可指定 USING BTREE 或 USING HASH。但不能用 USING HASH 创建多值索引。
 - `visibility_option`：指定索引的可见性。
 - `DATA_TABLE_ID data_table_id`：指定索引所属的数据表 ID。
 - `INDEX_TABLE_ID index_table_id`：指定索引表的 ID。
 - `VIRTUAL_COLUMN_ID virtual_column_id`：指定虚拟列的 ID。
 - `MAX_USED_PART_ID used_part_id`：指定索引的最大使用分区 ID。

### index_column_group_option

- `WITH COLUMN GROUP(all columns, each column)`：指定创建行存列存冗余的索引。
 - `WITH COLUMN GROUP(each column)`：指定创建列存索引。

## 示例

使用以下 SQL 语句为表创建列存索引。

1. 使用下面 SQL 语句创建表 `test_tbl1`。

   ```sql
   CREATE TABLE test_tbl1 (col1 INT, col2 VARCHAR(50));

   ```
 2. 在 `test_tbl1` 表上创建列存索引 `idx1_test_tbl1`，引用 `col1` 列。

   ```sql
   CREATE INDEX idx1_test_tbl1 ON test_tbl1 (col1) WITH COLUMN GROUP(each column);

   ```

## 相关文档

- [索引简介](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001576903)
 - [创建索引](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001576029)
 - [查看索引](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001576027)
 - [删除索引](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001576026)

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
