可以在表的一个或多个列上创建索引以加速表上的 SQL 语句执行速度。索引使用正确的话,可以减少物理 IO 或者逻辑 IO。

如果创建表时同时设置了主键,OceanBase 数据库会默认创建一个唯一索引。以下面的 SQL 为例:

  1. obclient> DROP TABLE IF EXISTS t1;
  2. Query OK, 0 rows affected (0.01 sec)
  3. obclient> CREATE TABLE t1(id bigint not null primary key, name varchar(50));
  4. Query OK, 0 rows affected (0.05 sec)
  5. obclient> show indexes from t1\G
  6. *************************** 1. row ***************************
  7. Table: t1
  8. Non_unique: 0
  9. Key_name: PRIMARY
  10. Seq_in_index: 1
  11. Column_name: id
  12. Collation: A
  13. Cardinality: NULL
  14. Sub_part: NULL
  15. Packed: NULL
  16. Null:
  17. Index_type: BTREE
  18. Comment: available
  19. Index_comment:
  20. Visible: YES
  21. 1 row in set (0.01 sec)

新增索引

为表增加索引可以通过 CREATE INDEX 语句。OceanBase 能在普通表和分区表上创建索引,索引可以是本地索引或者全局索引。同时索引可以是唯一索引或者普通索引,如果是分区表的唯一索引,唯一索引必须包含表分区的拆分键。

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

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

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

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

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

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

  • 示例:对分区表新增索引
  1. obclient> create table t1(id bigint not null primary key ,name varchar(50) not null);
  2. Query OK, 0 rows affected (0.06 sec)
  3. obclient> show indexes from t1;
  4. *************************** 1. row ***************************
  5. Table: t1
  6. Non_unique: 0
  7. Key_name: PRIMARY
  8. Seq_in_index: 1
  9. Column_name: id
  10. Collation: A
  11. Cardinality: NULL
  12. Sub_part: NULL
  13. Packed: NULL
  14. Null:
  15. Index_type: BTREE
  16. Comment: available
  17. Index_comment:
  18. Visible: YES
  19. 1 row in set (0.00 sec)
  20. obclient> create table t3(
  21. id bigint not null primary KEY
  22. , name varchar(50)
  23. , gmt_create timestamp not null default current_timestamp
  24. ) partition by hash(id) partitions 8;
  25. Query OK, 0 rows affected (0.14 sec)
  26. obclient> alter table t3 add unique key t3_uk (name) local;
  27. ERROR 1503 (HY000): A UNIQUE INDEX must include all columns in the table's partitioning function
  28. obclient> alter table t3
  29. add unique key t3_uk (name, id) LOCAL
  30. , add key t3_ind3(gmt_create) global;
  31. Query OK, 0 rows affected (18.03 sec)
  32. obclient> show indexes from t3;

image.png

删除索引

删除索引的语法格式如下:

  1. ALTER TABLE table_name DROP key|index index_name ;

示例:删除表的索引

  1. obclient> alter table t3 drop key t3_uk, drop key t3_ind3;
  2. Query OK, 0 rows affected (0.07 sec)