2012-01-18 3 views
0

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

ALTER TABLE table_name ENGINE = InnoDB; 

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

+0

Определить «навсегда». Вы пишете, как будто это заняло очень долгий период времени, но не навсегда. Было бы полезно узнать, действительно ли это было сделано, сколько времени потребовалось. –

+0

@ todda.speot.is: Он не завершился. Я убил запрос. –

ответ

2

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

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

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

+0

My innodb_buffer_pool_size - 134 МБ. Насколько вам, по вашему мнению, достаточно? –

+0

Для стола 700 МБ? По крайней мере 1GB;) Общее правило здесь: чем больше, тем лучше. – Mchl

+0

Вы указали причину, по которой так долго. На этот раз я терпеливо ждал, и это закончилось через 1 час 25 минут. Не уверен, можно ли это сделать быстрее. –

4

Существует discussion of issues относительно преобразования в 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 Если TABLE ALTER операция выполняется из космоса, он начинает откат, и это может занять часов, если он связан с диском. "

+0

Спасибо за ссылку. Я принял очки 1 и 3. Но мне все же потребовалось 1 час 25 минут для стола 700 МБ и 200 МБ индекса. Не уверен, что это так быстро, как я могу получить. –

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