为什么在MyISAM表上删除一个索引这么慢?

为什么在MyISAM表上删除一个索引这么慢? 我无法想象我会有7亿条logging和下降指数的社交networking。

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

DROP INDEX

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

但是,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 

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

问题:

  • 为什么DROP INDEX比ALTER TABLE慢?
  • 为什么在如此小的桌子上放慢指数?

如果你想微观pipe理索引的丢失,为什么不自动化自己?

 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; 

这基本上是ALTER TABLE在“引擎盖下”

这样做会让你看到每个内部步骤的时间。

美国东部时间2011-10-10 14:08

我亲自研究过这个 我记得向MySQL抱怨,在添加或删除时添加索引的速度有多慢,并build议他们如何解决这个问题。 那是在2006年10月 。

然后,突然之间,有人在2011年5月12日询问了这个问题。张贴问题的人( JIStone )甚至将我原来的post引用到MySQL。 直到大约7分钟后,我才意识到我实际上是在处理我自己的5岁的职位。

为什么? 因为开发者犯了错误?! 为什么要有一个错误报告,当它不是一个错误 – 所以一直等到它被修复或自己修复 – 因为你甚至有一个解决方法,你可以忍受它。

但正确的答案是, DROP INDEX在执行时不会locking表。 因此,需要更多的时间来允许读取和写入,而ALTER TABLElocking表,因此可以专注于下降过程。