您可以通过 CREATE INDEX 语句为表创建索引。

OceanBase 数据库支持在非分区表和分区表上创建索引,索引可以是局部索引或全局索引,也可以是唯一索引或普通索引。如果是分区表的唯一索引,则唯一索引必须包含表分区的拆分键。

本节主要介绍如何在非分区表上创建索引,分区表上索引的创建请参见 在分区表上建立索引 章节。

MySQL 模式

MySQL 模式下,创建索引的 SQL 语法格式如下:

  1. CREATE [UNIQUE] INDEX index_name ON table_name ( column_list ) [LOCAL | GLOBAL] [ PARTITION BY column_list PARTITIONS N ] ;

MySQL 租户里,索引名称在表范围内不能重复,查看索引可以通过命令 SHOW INDEX

在 MySQL 租户里,新增索引还有一种方法,其 SQL 语法格式如下:

  1. ALTER TABLE table_name
  2. ADD INDEX|KEY index_name ( column_list ) ;

该语句可以一次增加多个索引,索引关键字用 INDEX 或 KEY 都可以。

示例:为非分区表创建普通索引。

  1. obclient> CREATE TABLE test (c1 int primary key, c2 VARCHAR(10));
  2. Query OK, 0 rows affected (0.20 sec)
  3. obclient> CREATE INDEX idx ON test (c1, c2);
  4. Query OK, 0 rows affected (0.59 sec)
  5. obclient> SHOW INDEX FROM test;
  6. +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+
  7. | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible |
  8. +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+
  9. | test | 0 | PRIMARY | 1 | c1 | A | NULL | NULL | NULL | | BTREE | available | | YES |
  10. | test | 1 | idx | 1 | c1 | A | NULL | NULL | NULL | | BTREE | available | | YES |
  11. | test | 1 | idx | 2 | c2 | A | NULL | NULL | NULL | YES | BTREE | available | | YES |
  12. +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+
  13. 3 rows in set (0.00 sec)

Oracle 模式

Oracle 模式下,创建索引的 SQL 语法格式如下:

  1. CREATE [UNIQUE] INDEX index_name ON table_name ( column_list ) [LOCAL | GLOBAL] [ PARTITION BY column_list PARTITIONS N ] ;

在 Oracle 租户里,索引名称在租户范围内不能重复。

示例:为非分区表创建普通索引。

  1. obclient> CREATE INDEX t1_name_ind ON t1(name);
  2. Query OK, 0 rows affected (0.43 sec)
  3. obclient> SELECT index_name,index_type,table_owner,table_name,uniqueness FROM user_indexes WHERE table_name='T1';
  4. +--------------------------+------------+-------------+------------+------------+
  5. | INDEX_NAME | INDEX_TYPE | TABLE_OWNER | TABLE_NAME | UNIQUENESS |
  6. +--------------------------+------------+-------------+------------+------------+
  7. | T1_OBPK_1585822641424088 | NORMAL | TPCC | T1 | UNIQUE |
  8. | T1_NAME_IND | NORMAL | TPCC | T1 | NONUNIQUE |
  9. +--------------------------+------------+-------------+------------+------------+
  10. 2 rows in set (0.02 sec)