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

Уменьшение размера таблицы MyISAM

У меня есть таблица MyISAM, которая в настоящее время содержит около 54 миллионов записей и имеет размер 20 ГБ. При разработке этой базы данных был сделан неудачный выбор. Я не профессионал в области DB, но поскольку эта таблица постоянно записывается и редко запрашивается, кажется, InnoDB был бы лучшим выбором. Проблема в том, что эта таблица должна быть доступна для записи почти всегда. Одно из полей - это поле с отметкой времени. Записи ведутся 5 лет назад - мне нужно хранить только последние 6 месяцев. Я пробовал несколько удалений, требуется около 20 минут, чтобы удалить 200000 строк, в течение которых таблица заблокирована и не может быть записана. Есть ли у кого-нибудь предложения, как я могу уменьшить размер этой таблицы, не блокируя ее на несколько часов? Есть ли более быстрый способ удалить ненужные строки? Я никогда не преобразовывал таблицу MyISAM в таблицу InnoDB. Это длительный процесс?

Наконец-то у меня было время вернуться к этому проекту, и для полноты картины я хотел опубликовать то, чем я закончил. Исходная проблема с DELETE FROM, которая занимает так много времени, я считаю, связана с тем, как я указывал строки для удаления. Я использовал утверждение, похожее на

DELETE FROM table WHERE starttime < 20150101 limit 200000;

Поле starttime на самом деле является DATETIME. В итоге я создал новую таблицу, используя

CREATE TABLE new_table LIKE existing_table;

а затем изменить движок новой таблицы

ALTER TABLE new_table ENGINE=InnoDB;

а затем переименование

RENAME TABLE existing_table TO old_table, new_table TO existing_table;

После этого мне нужно было перенести данные из старой таблицы за 6 месяцев в новую.

INSERT INTO existing_table SELECT * FROM old_table WHERE starttime BETWEEN DATE_SUB(NOW(), INTERVAL 6 MONTH) AND NOW();

Спасибо, Мартин, за предложение. Я новичок в serverfault, поэтому не уверен, как бы отметить его комментарий как ответ.

MyISAM подходит только для SELECT. Innodb имеет отдельные очереди READ и WRITE. Поэтому при удалении 200 000 строк таблицы не будут заблокированы. Блокировки таблиц - это одно из больших ограничений MyISAM, когда речь идет о производстве. InnoDB медленнее MyISAM для большинства применений, но может работать быстрее в определенных условиях из-за лучшего механизма блокировки; MyISAM блокирует всю таблицу для чтения во время выполнения вставки / обновления. InnoDB может выполнять блокировку на уровне строк, что позволяет выполнять несколько одновременных операций записи и чтения в таблице.

http://kakadba.blogspot.in/2014/02/innodb-vs-myisam.html

Преобразование MyISAM в INNODB

Вы можете сделать это таблица за таблицей

ALTER TABLE table_name ENGINE=InnoDB;

Или вы можете попробовать скрипт, чтобы сделать все сразу

https://stackoverflow.com/questions/3856435/how-to-convert-all-tables-from-myisam-into-innodb