Почему преобразование из MyISAM в InnoDB занимает вечность? - PullRequest
0 голосов
/ 18 января 2012

Я хотел преобразовать таблицу 700 МБ из MyISAM в InnoDB с помощью следующей команды:

ALTER TABLE table_name ENGINE = InnoDB;

Я не уверен, почему это заняло вечность (не завершилось, я убил запрос после часа ожидания). Я заметил, что использование памяти возросло до 60%, и плато отключилось. Я подозреваю, что настройка какого-либо параметра может помочь, но мне интересно, какой именно.

Ответы [ 2 ]

4 голосов
/ 18 января 2012

Существует обсуждение вопросов относительно преобразования в InnoDB в документах MySQL.

Вот некоторые основные моменты / цитаты:

  • Есливаша таблица имеет уникальные ограничения, затем сначала отключите уникальные проверки:

    SET unique_checks=0;
    ALTER TABLE table_name ENGINE = InnoDB;    
    SET unique_checks=1;
    
  • "Чтобы получить лучший контроль над процессом вставки, может быть полезно вставлять большие таблицы по частям:"

    INSERT INTO newtable SELECT * FROM oldtable
    WHERE yourkey > something AND yourkey <= somethingelse;
    

    После того, как все записи будут вставлены, вы можете переименовать таблицы.

  • "Во время преобразования больших таблиц вы должны увеличить размер буферного пула InnoDB для уменьшения дискового ввода-вывода."

  • «Убедитесь, что вы не заполняете табличное пространство: таблицам InnoDB требуется намного больше дискового пространства, чем таблицам MyISAM. Если операции ALTER TABLE не хватает места, она запускает откат, и это может занять несколько часов, если оно связано с диском. "

3 голосов
/ 18 января 2012

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

Вы можете попробовать просто выгрузить таблицу в SQL, отредактировать дамп так, чтобы оператор создания таблицы использовал InnoDB вместо MyISAM,и загрузить его обратно.Я думаю, что это может быть немного быстрее.

Также обратите внимание, что значения по умолчанию для буферного пула InnoDB в вашем my.cnf могут быть действительно низкими, в результате чего InnoDB не получает почти достаточно памяти для эффективной работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...