Движки хранения: InnoDB и MyISAM
Разбираемся, что такое движок хранения и почему почти всегда стоит выбирать InnoDB.
Движок хранения (storage engine) — внутренний механизм MySQL, который отвечает за то, как таблица физически хранится на диске и какие возможности (транзакции, ключи, блокировки) она поддерживает.
Зачем вообще движки
Особенность MySQL — у одной базы разные таблицы могут использовать разные движки. Движок задаётся при создании таблицы и определяет её «характер»: умеет ли она транзакции, есть ли в ней внешние ключи, как блокируются данные при записи. Исторически у MySQL было много движков, но на практике важны два: InnoDB и MyISAM.
InnoDB — выбор по умолчанию
InnoDB — современный движок и значение по умолчанию в актуальных версиях MySQL. Его сильные стороны:
- Транзакции (ACID): группу изменений можно подтвердить целиком или откатить.
- Внешние ключи (FOREIGN KEY): база сама следит за ссылочной целостностью.
- Блокировки на уровне строк: при записи блокируется одна строка, а не вся таблица — лучше для параллельной нагрузки.
- Восстановление после сбоя: журнал позволяет вернуть согласованное состояние.
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
total DECIMAL(10,2)
) ENGINE=InnoDB;
MyISAM — старый и простой
MyISAM был движком по умолчанию в ранних версиях. Он проще и в некоторых сценариях «только чтение» бывал быстрее, но у него есть серьёзные ограничения:
- Нет транзакций — нельзя откатить группу изменений.
- Нет внешних ключей.
- Блокировка на уровне всей таблицы — при записи остальные ждут.
Сегодня MyISAM используют редко: новые проекты почти всегда на InnoDB.
Сравнение
| Возможность | InnoDB | MyISAM |
| Транзакции | да | нет |
| Внешние ключи | да | нет |
| Блокировки | на уровне строки | на уровне таблицы |
| Восстановление после сбоя | надёжное | слабое |
Как посмотреть и сменить движок
SHOW TABLE STATUS WHERE Name = 'orders'; -- увидеть Engine
ALTER TABLE orders ENGINE = InnoDB; -- сменить движок
Это команды самой MySQL, поэтому блок помечен как текст. Логика данных от движка не зависит: тот же SELECT работает одинаково — отличаются гарантии и поведение под нагрузкой.
Итог
- Движок хранения определяет, как таблица хранится и что умеет.
- InnoDB — выбор по умолчанию: транзакции, внешние ключи, блокировки строк.
- MyISAM — устаревший: без транзакций и внешних ключей, блокирует таблицу целиком.
- Движок задаётся через
ENGINE=...и меняется черезALTER TABLE ... ENGINE.