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

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

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

6 ответов

Решение

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

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

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

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

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

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

Некоторые другие заметки:

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам