CREATE INDEX
示例
CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, c1 INT NOT NULL);
Query OK, 0 rows affected (0.10 sec)
INSERT INTO t1 (c1) VALUES (1),(2),(3),(4),(5);
Query OK, 5 rows affected (0.02 sec)
Records: 5 Duplicates: 0 Warnings: 0
EXPLAIN SELECT * FROM t1 WHERE c1 = 3;
Query OK, 0 rows affected (0.30 sec)
EXPLAIN SELECT * FROM t1 WHERE c1 = 3;
+------------------------+---------+-----------+------------------------+---------------------------------------------+
| id | estRows | task | access object | operator info |
| IndexReader_6 | 10.00 | root | | index:IndexRangeScan_5 |
| └─IndexRangeScan_5 | 10.00 | cop[tikv] | table:t1, index:c1(c1) | range:[3,3], keep order:false, stats:pseudo |
+------------------------+---------+-----------+------------------------+---------------------------------------------+
2 rows in set (0.00 sec)
ALTER TABLE t1 DROP INDEX c1;
CREATE UNIQUE INDEX c1 ON t1 (c1);
Query OK, 0 rows affected (0.31 sec)
如果需要使用这一特性,在 中进行以下设置:
allow-expression-index = true
考虑以下查询:
如果建立了如下的表达式索引,就可以使用索引加速以上查询:
CREATE INDEX idx ON t ((lower(name)));
维护表达式索引的代价比一般的索引更高,因为在插入或者更新每一行时都需要计算出表达式的值。因为表达式的值已经存储在索引中,所以当优化器选择表达式索引时,表达式的值就不需要再计算。因此,当查询速度比插入速度和更新速度更重要时,可以考虑建立表达式索引。
不可见索引
不可见索引(Invisible Indexes)不会被查询优化器使用:
具体可以参考 。
和 CREATE INDEX
语句相关的系统变量有 tidb_ddl_reorg_worker_cnt
、tidb_ddl_reorg_batch_size
和 tidb_ddl_reorg_priority
,具体可以参考系统变量。
MySQL 兼容性
- 不支持
FULLTEXT
,HASH
和SPATIAL
索引。 - 不支持降序索引 (类似于 MySQL 5.7)。
- 无法向表中添加
CLUSTERED
类型的PRIMARY KEY
。要了解关于CLUSTERED
主键的详细信息,请参考聚簇索引。