Почему удаление индекса в таблице MyISAM происходит так медленно? Не могу представить, чтобы у меня была социальная сеть с 700 миллионами записей и падающим индексом.
Есть только индексы с одним столбцом, все они полнотекстовые (мне нужно переключиться на нормальный индекс, так как 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
Есть даже отчет об ошибке для этого, но нет действительного решения.
Вопросы:
Если вы хотите контролировать падение индекса на микроуровне, почему бы не автоматизировать себя?
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 года.
Затем, внезапно, из ниоткуда, кто-то спросил об этой же проблеме 12 мая 2011 года. Человек, разместивший вопрос (JIStone) даже сослался на мой исходный пост в MySQL. Я не осознавал этого примерно через 7 минут, что на самом деле обращался к своему собственному посту 5-летней давности.
Зачем? Потому что разработчики ошиблись ?! Зачем должен быть отчет об ошибке, если это не ошибка? Так что подождите, пока он не будет исправлен, или исправьте его самостоятельно. У вас даже есть обходной путь, с которым можно жить.
Но правильный ответ был бы таков DROP INDEX
не блокирует таблицу во время выполнения. И поэтому требуется больше времени, чтобы разрешить чтение и запись при опускании. ALTER TABLE
блокирует стол и может сосредоточиться на процессе опускания.