MySQL 允许 DROP INDEX 语句从表中删除现有索引。要从表中删除索引,我们可以使用以下查询:
mysql>DROP INDEX index_name ON table_name [algorithm_option | lock_option];
如果我们要删除一个索引,需要做两件事:
- 首先,我们必须指定要删除的索引的名称。
- 其次,您的索引所属的表的名称。
Drop Index 语法包含两个可选选项,分别是 Algorithm 和 Lock,用于在索引修改期间读写表。让我们详细解释两者:
算法选项
algorithm_option 使我们能够指定用于删除表中索引的特定算法。algorithm_option的语法如下:
Algorithm [=] {DEFAULT | INPLACE | COPY}
Drop Index 语法主要支持两种算法,即 INPLACE 和 COPY。
COPY:该算法允许我们将一个表逐行复制到另一个新表中,然后在这个新表上执行 DROP Index 语句。在这个表上,我们不能执行 INSERT 和 UPDATE 语句来进行数据操作。
INPLACE:该算法允许我们重建表而不是复制原始表。我们可以在这张表上执行所有的数据操作操作。在这个表上,MySQL在索引删除期间发出一个独占元数据锁。
注意:如果没有定义 algorithm 子句,MySQL 使用 INPLACE 算法。如果不支持 INPLACE,则使用 COPY 算法。DEFAULT 算法的工作原理与在 Drop index 语句中不使用任何算法子句的情况相同。
锁定选项
该子句使我们能够在索引删除期间控制并发读写的级别。lock_option的语法如下:
LOCK [=] {DEFAULT|NONE|SHARED|EXCLUSIVE}
在语法中,我们可以看到 lock_option 包含四种模式,DEFAULT、NONE、SHARED 和 EXCLUSIVE。现在,我们将详细讨论所有模式:
SHARED:此模式仅支持并发读取,不支持并发写入。当不支持并发读取时,会报错。
DEFAULT:此模式可以具有指定算法的最大并发级别。如果支持,它将启用并发读取和写入,否则强制执行独占模式。
NONE:如果支持此模式,则您具有并发读写。否则,它会出错。
EXCLUSIVE:此模式强制执行独占访问。
例子
首先,执行以下命令以显示表中可用的索引。
mysql> SHOW INDEXES FROM student;
它将给出以下输出。
在输出中,我们可以看到有三个索引可用。现在,执行以下语句从表student 中删除类索引。
mysql> DROP INDEX age ON student ALGORITHM = INPLACE LOCK = DEFAULT;
再次执行 SHOW INDEXES 语句以验证索引是否已删除。执行此语句后,我们将得到以下输出,其中只有两个索引可用。
使用算法和锁的示例
以下语句使用算法和锁定选项从学生表中删除年龄索引。
mysql> DROP INDEX age ON student ALGORITHM = INPLACE LOCK = DEFAULT;
MySQL 删除 PRIMARY 键索引
在某些情况下,该表包含一个 PRIMARY 索引,每当您使用主键或唯一键创建表时都会创建该索引。在这种情况下,我们需要执行以下命令,因为 PRIMARY 是保留字。
mysql> DROP INDEX PRIMARY ON table_name;
要从 student 表中删除主键索引,请执行以下语句:
mysql> DROP INDEX PRIMARY ON student;