CREATE INDEX

    示例

    1. CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, c1 INT NOT NULL);
    1. Query OK, 0 rows affected (0.10 sec)
    1. INSERT INTO t1 (c1) VALUES (1),(2),(3),(4),(5);
    1. Query OK, 5 rows affected (0.02 sec)
    2. Records: 5 Duplicates: 0 Warnings: 0
    1. EXPLAIN SELECT * FROM t1 WHERE c1 = 3;
      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. | IndexReader_6 | 10.00 | root | | index:IndexRangeScan_5 |
      4. | └─IndexRangeScan_5 | 10.00 | cop[tikv] | table:t1, index:c1(c1) | range:[3,3], keep order:false, stats:pseudo |
      5. +------------------------+---------+-----------+------------------------+---------------------------------------------+
      6. 2 rows in set (0.00 sec)
      1. ALTER TABLE t1 DROP INDEX c1;
      1. CREATE UNIQUE INDEX c1 ON t1 (c1);
      1. Query OK, 0 rows affected (0.31 sec)

      如果需要使用这一特性,在 中进行以下设置:

      1. allow-expression-index = true

      考虑以下查询:

        如果建立了如下的表达式索引,就可以使用索引加速以上查询:

        1. CREATE INDEX idx ON t ((lower(name)));

        维护表达式索引的代价比一般的索引更高,因为在插入或者更新每一行时都需要计算出表达式的值。因为表达式的值已经存储在索引中,所以当优化器选择表达式索引时,表达式的值就不需要再计算。因此,当查询速度比插入速度和更新速度更重要时,可以考虑建立表达式索引。

        不可见索引

        不可见索引(Invisible Indexes)不会被查询优化器使用:

        具体可以参考 。

        CREATE INDEX 语句相关的系统变量有 tidb_ddl_reorg_worker_cnttidb_ddl_reorg_batch_sizetidb_ddl_reorg_priority,具体可以参考系统变量

        MySQL 兼容性

        • 不支持 FULLTEXTHASHSPATIAL 索引。
        • 不支持降序索引 (类似于 MySQL 5.7)。
        • 无法向表中添加 CLUSTERED 类型的 PRIMARY KEY。要了解关于 CLUSTERED 主键的详细信息,请参考聚簇索引