Отличия движков InnoDB от MyISAM в MySQL

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

 

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

 

 

Отличия InnoDB от MyISAM

Главное преимущество InnoDB в скорости работы — при выполнении запроса к базе InnoDB происходит блокировка строки, при выполнении же запроса к базе MyISAM блокируется таблица, это означает, что пока запрос выполнен не будет никакие другие обращения к таблице/строке будут невозможны. Поскольку строки значительно меньше InnoDB обрабатывается быстрее.

 

InnoDB в отличии от MyISAM поддерживает транзакции, а MyISAM имеет полнотекстовый поиск для всех версий Mysql (для InnoDB такая поддержка есть только для версий старше 5.6.4)

 

 

MyISAM таблицы можно без всяких трудностей конвертировать в InnoDB (как и выполнять преобразование в обратном направлении). Это делается при помощи ALTER TABLE или скриптом если таблиц много.

 

При ковертации стоит иметь в виду, что начиная с версии MySQL 5.6 и эквивалентной ей MariaDB 10 InnoDB является движком по умолчанию. Для ранних версий по умолчанию таблицы создавались в MyISAM.

В настоящее время InnoDB используется значительно чаще, но есть два важных момента:

 

Недостатки InnoDB:
  1. InnoDB также сложнее восстанавливать после сбоя в работе сервера, для MyISAM восстановление заключается в применении утилиты myisamchk
  2. Изначально сами данные как составляющая таблиц хранятся в одном файле ibdata1. Информация из этого файла не удаляется. Т.е. если таблица добавлена, в нее загружен дамп, потом таблица удалена — в ibdata1 содержимое останется и будет накапливаться занимая дисковое пространство.  Также хранение данных по всем таблицам в одном файле означает, что с таблицами сложнее работать, нельзя перемещать их и восстанавливать из резервных копий по отдельности.

 

Второй вопрос решается добавлением в конфигурационный файл директивы innodb_file_per_table = 1; (подробнее о хранении данных InnoDB)

 

mcedit /etc/mysql/my.cnf

innodb_file_per_table = 1;

 

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

Читайте про то как преобразовать большое количество MyISAM таблиц в InnoDB.