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
为从表中删除指定的索引。