MySQL 删除索引

在 MySQL 数据库中,您可以使用 DROP INDEX 从表中删除已有的索引。

有时候,您可能因为以下一些原因想要从一个表中删除一个或多个索引:

  • 创建了错误的索引
  • 为了更快,在插入或更新大量的数据之前先删除索引

MySQL 允许您使用 DROP INDEX 从表中删除已有的索引。

MySQL DROP INDEX 语句语法

您应该按照如下的语法使用 DROP INDEX 从一个表中删除一个索引:

DROP INDEX index_name
ON table_name
[algorithm_option | lock_option];

在这个语法中:

  • index_name 是索引的名字。

  • table_name 是表的名字。

  • algorithm_option 指定删除索引的算法。它使用以下的语法:

    ALGORITHM [=] {DEFAULT | INPLACE | COPY}
    

    ALGORITHM 子句是可选的。默认为 INPLACE。如果不支持 INPLACE,则使用 COPY

    使用 DEFAULT 和省略 ALGORITHM 子句效果相同。

    以下是对各个算法的说明:

    • COPY:对原表的副本进行操作,将原表中的表数据逐行复制到新表中。不允许并发 DML。
    • INPLACE: 操作避免复制表数据,但可能会就地重建表。在操作的准备和执行阶段,可能会短暂地对表进行独占元数据锁定。通常,支持并发 DML。
  • lock_option 指定删除索引的并发控制策略。它使用以下的语法:

    LOCK [=] {DEFAULT | NONE | SHARED | EXCLUSIVE}
    

    LOCK 子句是可选的。以下是对各个并发策略的说明:

    DEFAULT
    给定 ALGORITHM 子句(如果有)和 ALTER TABLE 操作的最大并发级别:如果支持,则允许并发读取和写入。如果不是,则允许并发读取(如果支持)。如果不是,则强制执行独占访问。
    NONE
    如果支持,允许并发读取和写入。否则,会发生错误。
    SHARED
    如果支持,允许并发读取但阻止写入。即使存储引擎支持给定 ALGORITHM 子句(如果有)和 ALTER TABLE 操作的并发写入,写入也会被阻止。如果不支持并发读取,则会发生错误。
    EXCLUSIVE
    强制执行独占访问。即使存储引擎支持给定 ALGORITHM 子句(如果有)和 ALTER TABLE 操作的并发读/写,也会这样做。

在 MySQL 内部,DROP INDEX 语句被映射为 ALTER TABLE ... DROP INDEX ... 语句。

MySQL DROP INDEX 实例

在 MySQL 创建索引教程中,我们在 Sakila 示例数据库中的 actor创建了一个索引 first_name

现在,我们将使用下面的语句将它删除:

DROP INDEX first_name ON actor;

要查看索引是否删除成功,请使用以下 SHOW INDEXES 语句显示表 actor 的索引,例如:

SHOW INDEXES FROM actor;

这是输出:

+-------+------------+---------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table | Non_unique | Key_name            | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+-------+------------+---------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| actor |          0 | PRIMARY             |            1 | actor_id    | A         |         201 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
| actor |          1 | idx_actor_last_name |            1 | last_name   | A         |         122 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
+-------+------------+---------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+

MySQL 删除主键索引

在 MySQL 中,主键的索引名字固定为 PRIMARY。要删除表 t 上的主键索引,请使用下面的语句:

DROP INDEX `PRIMARY` ON t;

结论

在 MySQL 中, 您可以使用 DROP INDEX 为从表中删除指定的索引。