Есть ли какие-либо подводные камни / вещи, которые вам нужно знать при переходе с MyISAM на InnoDB

один из моих проектов использует движок MyISAM в MySQL, но я рассматриваю его изменение на InnoDB, поскольку мне нужна поддержка транзакций здесь и там.

  • что я должен посмотреть или подумать перед этим?
  • могу я как раз изменить двигатель, или должны данные быть подготовлены для его?

6 ответов


Да абсолютно, есть много вещей, вы должны проверить свое приложение очень тщательно:

  • транзакции могут взаимоблокировки и должны быть повторены. Это имеет место (в некоторых случаях) даже с автокоммиттированной транзакцией, которая вставляет только одну строку.
  • использование диска почти наверняка увеличат
  • загрузка ввода/вывода во время записи почти наверняка увеличится
  • поведение индексирования изменится, потому что InnoDB использует кластеризованный индексы-это может быть полезным эффектом в некоторых случаях
  • ваша стратегия резервного копирования будет затронута. Подумайте хорошенько.

сам процесс миграции должен быть тщательно спланирован, так как это займет много времени, если у вас много данных (в течение которого данные будут либо только для чтения, либо полностью недоступной - не проверить!)


есть одно большое предостережение. Если вы получите какой-либо аппаратный сбой (или аналогичный) во время записи, InnoDB повредит таблицы.

MyISAM также будет, но mysqlcheck --auto-repair отремонтирует их. Попытка этого с таблицами InnoDB не удастся. Да, это из опыта.

Это означает, что вам нужно иметь хороший регулярный план резервного копирования данных для использования InnoDB.


некоторые другие Примечания:

InnoDB не перераспределяет свободное пространство в файловой системе после удаления таблицы / базы данных или удаления записи, это можно решить с помощью "сброса и импорта" или установки innodb_file_per_table=1 в моем.cnf.

добавление / удаление индексов в большой таблице InnoDB может быть довольно болезненным, потому что он блокирует текущую таблицу, создает временную с измененными индексами и вставляет данные строка за строкой. Есть плагин от Innobase, но он работает только для MySQL 5.1

InnoDB также гораздо более интенсивная память, я предлагаю вам иметь как большой innodb_buffer_pool_size переменная, как позволяет память вашего сервера (70-80% должна быть безопасной ставкой). Если ваш сервер UNIX / Linux, рассмотрите возможность уменьшения переменной sysctl vm.swappiness 0, и использовать innodb_flush_method=O_DIRECT чтобы избежать двойной буферизации. Всегда проверяйте, нажимаете ли вы swap при переключении этих значений.Вы всегда можете прочитать больше на блог Фирконом, что здорово.

кроме того, вы можете запустить mysqlbackup С --single-transaction --skip-lock-tables и никаких блокировок таблиц, пока начинается резервное копирование.

в любом случае, InnoDB велик, не позволяйте некоторым ловушкам обескуражить вас.


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

  • один из больших, чтобы следить за это select count(*) from MyTable is много медленнее в InnoDB, чем MyISAM.
  • значения auto_increment будут сброшены до самого высокого значения в таблице +1 после перезагрузки сервера - это может вызвать забавные проблемы, если у вас есть беспорядочная БД с некоторыми удалениями.
  • оптимальные настройки сервера будут отличаться от в основном MyISAM децибел.
  • убедитесь, что размер файла innodb достаточно велик, чтобы вместить все ваши данные, или вы будете распяты постоянным перераспределением при изменении механизмов таблиц.

Если вы собираетесь использовать InnoDB как способ получения параллельных запросов, то вы захотите установить innodb_file_trx_commit=1 таким образом, вы получаете некоторую производительность. OTOH, если вы хотите перекодировать свое приложение, чтобы быть в курсе транзакций, то решение этого параметра будет частью общего обзора производительности, необходимого для настроек InnoDB.

другая важная вещь, которую нужно остерегаться, - это то, что InnoDB не поддерживает полнотекстовые индексы и не вставляет задержку. Но тогда MyISAM не поддерживает ссылочная целостность. :-)

однако вы можете перемещаться только по таблицам, которые вам нужны для транзакции. Я сделал это. Кстати, небольшие таблицы (до нескольких тысяч строк) часто можно менять "на лету".


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

данные будут в порядке.