ADD INDEX
ALTER TABLE.. ADD INDEX 语句用于在已有表中添加一个索引。在 TiDB 中,ADD INDEX 为在线操作,不会阻塞表中的数据读写。

警告
- 在升级 TiDB 集群的过程中,请勿执行 DDL 语句,否则可能会出现行为未定义的问题。
- 集群中有 DDL 语句正在被执行时(通常为
ADD INDEX和列类型变更等耗时较久的 DDL 语句),请勿进行升级操作。在升级前,建议使用 ADMIN SHOW DDL 命令查看集群中是否有正在进行的 DDL Job。如需升级,请等待 DDL 执行完成或使用 ADMIN CANCEL DDL 命令取消该 DDL Job 后再进行升级。
语法图
AlterTableStmt

AddIndexSpec

IndexPartSpecification

IndexOption

IndexType

1. AlterTableStmt
2. ::= 'ALTER' 'IGNORE'? 'TABLE' TableName AddIndexSpec ( ',' AddIndexSpec )*
4. AddIndexSpec
5. ::= 'ADD' ( ( 'PRIMARY' 'KEY' | ( 'KEY' | 'INDEX' ) 'IF NOT EXISTS'? | 'UNIQUE' ( 'KEY' | 'INDEX' )? ) ( ( Identifier? 'USING' | Identifier 'TYPE' ) IndexType )? | 'FULLTEXT' ( 'KEY' | 'INDEX' )? IndexName ) '(' IndexPartSpecification ( ',' IndexPartSpecification )* ')' IndexOption*
7. IndexPartSpecification
8. ::= ( ColumnName ( '(' LengthNum ')' )? | '(' Expression ')' ) ( 'ASC' | 'DESC' )
10. IndexOption
11. ::= 'KEY_BLOCK_SIZE' '='? LengthNum
12. | IndexType
13. | 'WITH' 'PARSER' Identifier
14. | 'COMMENT' stringLit
15. | 'VISIBLE'
16. | 'INVISIBLE'
18. IndexType
19. ::= 'BTREE'
20. | 'HASH'
21. | 'RTREE'
示例
1. CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, c1 INT NOT NULL);
1. Query OK, 0 rows affected (0.11 sec)
1. INSERT INTO t1 (c1) VALUES (1),(2),(3),(4),(5);
1. Query OK, 5 rows affected (0.03 sec)
2. Records: 5 Duplicates: 0 Warnings: 0
1. EXPLAIN SELECT * FROM t1 WHERE c1 = 3;
1. +-------------------------+----------+-----------+---------------+--------------------------------+
2. | id | estRows | task | access object | operator info |
3. +-------------------------+----------+-----------+---------------+--------------------------------+
4. | TableReader_7 | 10.00 | root | | data:Selection_6 |
5. | └─Selection_6 | 10.00 | cop[tikv] | | eq(test.t1.c1, 3) |
6. | └─TableFullScan_5 | 10000.00 | cop[tikv] | table:t1 | keep order:false, stats:pseudo |
7. +-------------------------+----------+-----------+---------------+--------------------------------+
8. 3 rows in set (0.00 sec)
1. ALTER TABLE t1 ADD INDEX (c1);
1. Query OK, 0 rows affected (0.30 sec)
1. EXPLAIN SELECT * FROM t1 WHERE c1 = 3;
1. +------------------------+---------+-----------+------------------------+---------------------------------------------+
2. | id | estRows | task | access object | operator info |
3. +------------------------+---------+-----------+------------------------+---------------------------------------------+
4. | IndexReader_6 | 0.01 | root | | index:IndexRangeScan_5 |
5. | └─IndexRangeScan_5 | 0.01 | cop[tikv] | table:t1, index:c1(c1) | range:[3,3], keep order:false, stats:pseudo |
6. +------------------------+---------+-----------+------------------------+---------------------------------------------+
7. 2 rows in set (0.00 sec)
MySQL 兼容性
- 不支持
FULLTEXT,HASH和SPATIAL索引。 - 不支持降序索引(类似于 MySQL 5.7)。
- 无法向表中添加
CLUSTERED类型的PRIMARY KEY。要了解关于CLUSTERED主键的详细信息,请参考聚簇索引。
