为什么删除 MyISAM 表上的索引这么慢?

gen*_*sis 4 mysql performance

为什么删除 MyISAM 表上的索引这么慢?我无法想象我会有 7 亿条记录和下降索引的社交网络。

只有一列索引,都是全文(我需要切换到普通索引,因为InnoDB不喜欢全文)

下降指数

mysql> DROP INDEX `post_text` ON phpbb_posts;
Query OK, 251171 rows affected (7 min 35.04 sec)
Records: 251171  Duplicates: 0  Warnings: 0
Run Code Online (Sandbox Code Playgroud)

但是,ALTER TABLE 比 DROP 快吗?

mysql> ALTER TABLE phpbb_posts DROP INDEX `post_content`;
Query OK, 251182 rows affected (1 min 45.06 sec)
Records: 251182  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE phpbb_posts DROP INDEX `post_subject`;
Query OK, 251188 rows affected (1 min 32.55 sec)
Records: 251188  Duplicates: 0  Warnings: 0
Run Code Online (Sandbox Code Playgroud)

甚至有一个错误报告,但没有有效的解决方案。

问题:

  • 为什么 DROP INDEX 比 ALTER TABLE 慢?
  • 为什么在这么小的表上删除索引这么慢?

Rol*_*DBA 6

如果您想对索引的删除进行微观管理,为什么不自己自动化?

CREATE TABLE phpbb_posts_new LIKE phpbb_posts;
ALTER TABLE phpbb_posts_new DROP INDEX post_text;
ALTER TABLE phpbb_posts_new DISABLE KEYS;
INSERT INTO phpbb_posts_new SELECT * FROM phpbb_posts;
ALTER TABLE phpbb_posts_new ENABLE KEYS;
ALTER TABLE phpbb_posts RENAME phpbb_posts_old;
ALTER TABLE phpbb_posts_new RENAME phpbb_posts;
DROP TABLE phpbb_posts_old;
Run Code Online (Sandbox Code Playgroud)

这基本上就是做 ALTER TABLE 会在“幕后”做的事情

这样做可以让您看到每个内部步骤的时间安排。

更新 2011-10-10 14:08 EDT

我实际上亲自研究过这个。我记得我向 MySQL 抱怨添加或删除索引时添加索引有多慢,并建议他们如何修复它。那是在 2006 年 10 月

然后,突然间,在 2011 年 5 月 12 日突然有人问了同样的问题。发布问题的人 ( JIStone ) 甚至将我的原始帖子引用到 MySQL。直到大约 7 分钟后,我才意识到我实际上是在写我自己 5 年前的帖子。