2013-04-13 6 views
1

У меня есть игровая БД, которая была первоначально создана в MySQL 3.x и все еще есть некоторые таблицы MyISAM.Как конвертировать огромную таблицу из MyISAM в INNODB?

Из-за разных причин (что является предметом отдельного обсуждения) я хочу перенести их в INNODB.

Одна из таблиц имеет 120 миллионов строк (например, 120 262 514). Я выполнил его преобразование в INNODB ... он был запущен вчера и продолжается ...

В дополнение к изменению движка я хотел изменить тип для нескольких полей. Запрос следующим образом:

ALTER TABLE gb_vfm5.my_table 
    CHANGE COLUMN matchId matchId INT(11) NOT NULL DEFAULT 0, 
    CHANGE COLUMN team team INT(11) NOT NULL DEFAULT 0, 
    CHANGE COLUMN pl1 pl1 INT(11) NOT NULL DEFAULT 0, 
    CHANGE COLUMN actionId actionId TINYINT(2) UNSIGNED NOT NULL DEFAULT 0, 
    CHANGE COLUMN src src TINYINT(2) UNSIGNED NOT NULL DEFAULT 0, 
    CHANGE COLUMN opponent opponent INT(11) NOT NULL DEFAULT 0, ENGINE = INNODB 

Вопросы:

  1. Почему выполнение запроса занимает так много времени? Вероятно, я должен 1-го изменить двигатель и после этого изменить поля?

  2. Каков наилучший/правильный способ сделать такие изменения?

  3. Насколько велика загрузка этого типа преобразования на сервер MySQL?

P.S. Сейчас я думаю о копировании БД в

P.P.S. Определение таблицы для конвертации:

CREATE TABLE my_moment(
    Id INT(11) NOT NULL AUTO_INCREMENT, 
    matchId INT(10) UNSIGNED NOT NULL DEFAULT 0, 
    mTime TINYINT(3) UNSIGNED NOT NULL DEFAULT 0, 
    team INT(10) UNSIGNED NOT NULL DEFAULT 0, 
    pl1 INT(10) UNSIGNED NOT NULL DEFAULT 0, 
    actionId TINYINT(1) UNSIGNED NOT NULL DEFAULT 0, 
    src TINYINT(1) UNSIGNED NOT NULL DEFAULT 0, 
    pos2 SMALLINT(5) UNSIGNED NOT NULL DEFAULT 0, 
    pl2 INT(11) NOT NULL DEFAULT 0, 
    poss1 SMALLINT(5) UNSIGNED NOT NULL DEFAULT 0, 
    poss2 SMALLINT(5) UNSIGNED NOT NULL DEFAULT 0, 
    mRes TINYINT(4) NOT NULL DEFAULT 0, 
    opponent INT(10) NOT NULL DEFAULT 0, 
    move TINYINT(3) UNSIGNED NOT NULL DEFAULT 0, 
    PRIMARY KEY (Id), 
    INDEX actionId (actionId, pl1, mRes), 
    INDEX matchId (matchId), 
    INDEX NewIndex1 (mRes), 
    INDEX NewIndex3 (actionId, pl2), 
    INDEX pl1 (pl1), 
    INDEX pos2 (pos2), 
    INDEX UK_my_table_MatchTeamAction (matchId, team, actionId) 
) 
ENGINE = MYISAM 
AUTO_INCREMENT = 125433749 
AVG_ROW_LENGTH = 36 
CHARACTER SET cp1251 
COLLATE cp1251_general_ci 
COMMENT = 'My table description'; 
+0

Вы не указали нам определения таблиц базовой таблицы. – fenway

+0

Добавлено. спасибо, что привлекли это мое внимание. – Budda

+1

При изменении таблиц MySQL создаст вторую таблицу с новыми атрибутами (или новым типом двигателя), скопирует все строки первой таблицы во вторую таблицу и затем заменит первую таблицу на вторую. Для большой таблицы эта операция займет много времени. – jmkeyes

ответ

1

Я не хотел бы оставить без ответа, поэтому я отправляю предложение Джошуа, как ответ.

При изменении таблиц, MySQL создаст вторую таблицу с новыми атрибутами (или новым типом двигателя), скопировать все строки первой таблицы, чтобы второй таблицы, а затем заменить первую таблицу со вторым один. Для большой таблицы эта операция займет много времени.

Итак, идея заключается в создании в моей собственной таблице, перемещении записи по частям из исходной таблицы в новую и при переименовании таблиц. Последний шаг - воссоздать внешние ключи.

Смежные вопросы