为什么删除 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
但是 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
甚至有一个错误报告但没有有效的解决方案。
问题:
- 为什么DROP INDEX 比ALTER TABLE 慢?
- 为什么在这么小的表上删除索引这么慢?
答案1
如果您想对索引的下降进行微观管理,为什么不实现自动化呢?
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 EDT
我实际上亲自研究过这一点。我记得我曾向 MySQL 抱怨过添加或删除索引时速度有多慢,并建议他们如何修复它。那是在 2006 年 10 月。
然后,突然间,不知何故,有人在 2011 年 5 月 12 日询问了同样的问题。发布问题的人(吉斯通) 甚至引用了我关于 MySQL 的原始帖子。直到大约 7 分钟后,我才意识到我实际上是在回复我自己 5 年前的帖子。
答案2
为什么?因为开发人员犯了错误?!既然不是错误,为什么还要报告错误?所以请等到问题修复或自行修复。因为您有解决方法,所以您可以忍受它。
但正确的答案应该是DROP INDEX
在执行时不锁定表。因此,删除时需要更多时间来允许读写 - 并ALTER TABLE
锁定表,这样就可以专注于删除过程。