Назад | Перейти на главную страницу

Почему удаление индекса в таблице MyISAM происходит так медленно?

Почему удаление индекса в таблице 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 блокирует стол и может сосредоточиться на процессе опускания.