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

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

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

Ответы [ 6 ]

8 голосов
/ 22 октября 2008

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

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

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

7 голосов
/ 26 июня 2009

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

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

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

5 голосов
/ 23 октября 2008

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

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 великолепен, не позволяйте некоторым подводным камням обескураживать вас.

3 голосов
/ 22 октября 2008

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

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

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

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

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

0 голосов
/ 22 октября 2008

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

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

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