Движки хранения: 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
BInnoDB
CMEMORY
DCSV
2. Чего НЕТ у движка MyISAM?
Aхранения на диске
Bтранзакций и внешних ключей
Cиндексов
Dвозможности читать данные
3. Почему блокировка на уровне строки лучше под параллельной нагрузкой?
Aона занимает меньше места на диске
Bпишущая операция блокирует только одну строку, а не всю таблицу
Cона работает без индексов
Dона отключает транзакции
Поддержать проект