删除索引查询很慢

Gar*_*ett 4 mysql indexing performance sql-drop

这是我试图执行的查询:

DROP INDEX id_index on table;

过去我已经能够快速删除索引,但是在我放弃之前,这个查询运行了将近一个小时。什么可能导致这种缓慢的速度?

Ric*_*mes 5

SHOW CREATE TABLE -- 如果显示 ENGINE=MyISAM,则 DROP 将按以下方式执行:

  1. 将整个表数据复制到临时表中(由于大量 I/O 而速度较慢)
  2. 重建所有剩余的索引(在某些情况下非常慢)
  3. 重命名以替换现有表(总是很快)

这可能会非常慢,具体取决于表的大小。这是因为所有磁盘 I/O。

如果它说 ENGINE=InnoDB,事情可能会更好。但是您是否删除 PRIMARY KEY 仍然很重要。并且可能 KEY 是否涉及 FOREIGN KEY 约束。我假设 old_alter_table 设置为 OFF。

http://dev.mysql.com/doc/refman/5.6/en/alter-table.html 有很多细节。你需要说的是ALGORITHM=INPLACE。你可能有 ALGORITHM=DEFAULT,我在文档中没有看到默认值是什么。

ALGORITHM=COPY 就像我上面提到的 MyISAM 一样。

无论表/索引大小如何,ALGORITHM=INPLACE 都应该花费很少的时间。

(请务必检查ALTER您正在运行的任何版本的详细信息。最近的主要版本有几个重大变化。)