MySQL 删除索引
MySQL允许使用DROP INDEX语句从表中删除现有的索引。要从表中删除索引,我们可以使用以下查询:
mysql>DROP INDEX index_name ON table_name [algorithm_option | lock_option];
如果我们想要删除一个索引,需要两个条件:
- 首先,我们必须指定我们想要删除的索引的名称。
- 其次,索引所属的表的名称。
Drop Index 语法包含两个可选项,即算法和锁定,用于在索引修改期间读取和写入表。让我们详细解释一下:
算法选项
算法选项允许我们指定在表中删除索引的特定算法。 algorithm_option 的语法如下:
Algorithm [=] {DEFAULT | INPLACE | COPY}
HTML: 这个算法主要支持两种,即INPLACE和COPY。
COPY: 此算法允许我们将一个表逐行复制到另一个新表,然后对此新表执行DROP Index语句。在这个表上,我们不能对数据进行INSERT和UPDATE操作。
INPLACE: 此算法允许我们重新构建一个表而不是复制原始表。我们可以在这个表上执行所有的数据操作。在这个表上,MySQL在索引删除期间发出一个独占的元数据锁。
注意:如果您未定义算法子句,则MySQL使用INPLACE算法。如果不支持INPLACE,则使用COPY算法。默认算法与不使用任何算法子句的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 中删除 class 索引。
mysql> DROP INDEX class ON student;
再次执行 SHOW INDEXES 语句以验证索引是否被删除。执行完此语句后,我们将得到以下输出结果,只有两个索引可用。
使用算法和锁的示例
以下语句使用算法和锁选项从 student 表中删除 age 索引。
mysql> DROP INDEX age ON student ALGORITHM = INPLACE LOCK = DEFAULT;
MySQL 删除主键索引
在某些情况下,数据表中包含一个主键索引,该索引在创建带有主键或唯一键的表时会自动创建。在这种情况下,我们需要执行以下命令,因为 “PRIMARY” 是一个保留字。
mysql> DROP INDEX PRIMARY ON table_name;
要从学生表中删除主键索引,请执行以下语句:
mysql> DROP INDEX PRIMARY ON student;