Движки хранения: 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.

Сравнение

ВозможностьInnoDBMyISAM
Транзакцииданет
Внешние ключиданет
Блокировкина уровне строкина уровне таблицы
Восстановление после сбоянадёжноеслабое

Как посмотреть и сменить движок

SHOW TABLE STATUS WHERE Name = 'orders';   -- увидеть Engine
ALTER TABLE orders ENGINE = InnoDB;        -- сменить движок

Это команды самой MySQL, поэтому блок помечен как текст. Логика данных от движка не зависит: тот же SELECT работает одинаково — отличаются гарантии и поведение под нагрузкой.

Итог

  • Движок хранения определяет, как таблица хранится и что умеет.
  • InnoDB — выбор по умолчанию: транзакции, внешние ключи, блокировки строк.
  • MyISAM — устаревший: без транзакций и внешних ключей, блокирует таблицу целиком.
  • Движок задаётся через ENGINE=... и меняется через ALTER TABLE ... ENGINE.
Проверьте себя
1. Какой движок хранения используется в современных версиях MySQL по умолчанию?
AMyISAM
BMEMORY
CCSV
DInnoDB
2. Чего НЕТ у движка MyISAM?
Aтранзакций и внешних ключей
Bхранения на диске
Cиндексов
Dвозможности читать данные
3. Почему блокировка на уровне строки лучше под параллельной нагрузкой?
Aона занимает меньше места на диске
Bпишущая операция блокирует только одну строку, а не всю таблицу
Cона работает без индексов
Dона отключает транзакции