У меня есть таблица 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