InnoDB и MyISAM являются двумя движками с которыми работает MySQL. Таблицы на одном сервере баз данных могут быть как одного типа, так и обоих. Рассмотрим основные отличия InnoDB от MyISAM.
Поскольку некоторые проекты развиваются в течение длительного времени — типы таблиц часто смешиваются и продолжают оставаться в таком виде.
Отличия InnoDB от MyISAM
Главное преимущество InnoDB в скорости работы — при выполнении запроса к базе InnoDB происходит блокировка строки. При выполнении же запроса к базе MyISAM блокируется таблица. Это означает, что пока запрос выполнен не будет никакие другие обращения к таблице/строке будут невозможны. Поскольку строки значительно меньше InnoDB обрабатывается быстрее.
InnoDB поддерживает транзакции. MyISAM имеет полнотекстовый поиск для всех версий Mysql. Для InnoDB такая поддержка есть только для версий старше 5.6.4.
MyISAM таблицы можно без всяких трудностей конвертировать в InnoDB (как и выполнять преобразование в обратном направлении). Это делается при помощи ALTER TABLE или скриптом если таблиц много.
При ковертации стоит иметь в виду, что начиная с версии MySQL 5.6 и эквивалентной ей MariaDB 10 InnoDB является движком по умолчанию. Для ранних версий по умолчанию таблицы создавались в MyISAM.
В настоящее время InnoDB используется значительно чаще, но есть два важных момента:
Недостатки InnoDB:
- InnoDB также сложнее восстанавливать после сбоя в работе сервера, для MyISAM восстановление заключается в применении утилиты myisamchk
- Изначально сами данные как составляющая таблиц хранятся в одном файле ibdata1. Информация из этого файла не удаляется. Т.е. если таблица добавлена, в нее загружен дамп, потом таблица удалена — в ibdata1 содержимое останется и будет накапливаться занимая дисковое пространство. Также хранение данных по всем таблицам в одном файле означает, что с таблицами сложнее работать. Нельзя перемещать их и восстанавливать из резервных копий по отдельности.
Второй вопрос решается добавлением в конфигурационный файл директивы innodb_file_per_table = 1; (подробнее о хранении данных InnoDB)
mcedit /etc/mysql/my.cnf
innodb_file_per_table = 1;
Отличия двух движков, таким образом, весьма значительные и какой использовать стоит решать в каждом конкретном случае. Почти всегда перевешивают плюсы InnoDB.
Читайте про то как преобразовать большое количество MyISAM таблиц в InnoDB.