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

StackOverflow https://stackoverflow.com/questions/225150

Вопрос

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

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

Решение

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

  • Транзакции могут зайти в тупик, и их необходимо повторить.Это имеет место (при некоторых обстоятельствах) даже с автоматически зафиксированной транзакцией, которая вставляет только одну строку.
  • Использование диска почти наверняка увеличится
  • Нагрузка ввода-вывода во время записи почти наверняка увеличится
  • Поведение индексации изменится, поскольку 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 при переключении этих значений.Вы всегда можете прочитать больше на Блог 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 не поддерживает полнотекстовые индексы и задержку ВСТАВКИ.Но тогда MyISAM не поддерживает ссылочную целостность.:-)

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top