Як змінити MyISAM на InnoDB: повний гайд
Привіт:) У цьому гайді покроково покажу як змінити MyISAM на InnoDB та навіщо це потрібно.
- 📚 Що таке MyISAM та InnoDB
- 🆚 Детальне порівняння: MyISAM vs InnoDB
- 🏛 Де використовуються MyISAM та InnoDB?
- 🔥 Чому MyISAM вже не рекомендований?
- 📌 Чому варто перейти з MyISAM на InnoDB
- 📎 Приклад із життя
- 🧪 Як дізнатися, які таблиці ще на MyISAM
- 🔄 Як змінити MyISAM на InnoDB
- 🧠 Як змінити тип однієї таблиці
- 🧠 Як автоматизувати зміну типу для всіх таблиць
- ✅ Варіант 1: генерація ALTER-запитів для всіх MyISAM-таблиць
- ☑ Варіант 2: PHP-скрипт для автоматичної заміни (на прикладі WordPress)
📚 Що таке MyISAM та InnoDB
У контексті СУБД MySQL (і її форків, таких як MariaDB), рушій зберігання даних (Storage Engines) — це модуль, який відповідає за фізичне збереження, читання та зміну даних у таблицях. Він визначає:
- як таблиця буде організована на диску;
- як відбувається доступ до даних;
- як працюють індекси, блокування, транзакції тощо.
MySQL дозволяє використовувати різні рушії зберігання для різних таблиць в одній базі даних. Це одна з її унікальних переваг.
📌 Найпопулярніші рушії:
- InnoDB — сучасний стандарт;
- MyISAM — застарілий, але досі трапляється;
- MEMORY, ARCHIVE, CSV, FEDERATED — для специфічних задач.
🆚 Детальне порівняння: MyISAM vs InnoDB
| Характеристика | MyISAM | InnoDB |
|---|---|---|
| 🚀 Швидкість читання | Висока | Висока |
| 💾 Швидкість запису | Вища для простих операцій | Оптимізована для паралельного запису |
| 🔐 Підтримка транзакцій | ❌ Немає | ✅ Повна підтримка (ACID) |
| 🔄 Автовідновлення при збоях | ❌ Обмежене | ✅ Так, підтримується |
| 🔗 Зовнішні ключі (FOREIGN KEY) | ❌ Немає | ✅ Так |
| 🔒 Блокування | Повне блокування таблиці | Блокування на рівні рядків |
| 📂 Файлова структура | Кожна таблиця → 3 файли (.frm, .MYD, .MYI) | Один .ibd-файл або загальне сховище |
| 🧩 Індекси повнотекстового пошуку | ✅ Підтримуються (раніше була перевага) | ✅ Підтримуються з MySQL 5.6+ |
| 🏗 Підтримка foreign constraints | ❌ Немає | ✅ Є |
| 📉 Масштабованість | Обмежена | Висока |
🏛 Де використовуються MyISAM та InnoDB?
| СУБД / Платформа | Підтримка рушіїв |
|---|---|
| MySQL | ✅ Основна СУБД, де активно використовуються |
| MariaDB | ✅ Повністю сумісна з MySQL і має ті ж рушії |
| Percona Server | ✅ Підтримує обидва та додаткові оптимізації |
🔥 Чому MyISAM вже не рекомендований?
- Немає відновлення після збою — при аварійному завершенні MyISAM-таблиці легко пошкоджуються.
- Відсутність транзакцій — неможливо виконати
BEGIN,COMMIT,ROLLBACK. - Повне блокування таблиць — не підходить для високонавантажених сайтів.
- Складне масштабування — великі об’єми даних працюють повільніше.
📌 Чому варто перейти з MyISAM на InnoDB
| Причина | Пояснення |
|---|---|
| 🔐 Безпечніші дані | InnoDB підтримує транзакції та відновлення після збоїв. |
| ⚡ Вища продуктивність | Блокування на рівні рядків, а не таблиць. |
| 🔄 Підтримка зовнішніх ключів | Можна створювати складні зв’язки між таблицями. |
| ✅ Сумісність із сучасними CMS | WordPress, Magento, Laravel — всі працюють краще з InnoDB. |
| 🔄 Поліпшення масштабування | InnoDB ефективніший на великих базах. |
📎 Приклад із життя
Ви переносите старий сайт на новий хостинг. Сайт працює повільно під час великого трафіку. Перевірка таблиць показує: 10+ таблиць MyISAM. Після конвертації на InnoDB:
- зменшились затримки при записах;
- покращилась стабільність при навантаженні;
- сайт працює швидше і надійніше.
🧪 Як дізнатися, які таблиці ще на MyISAM
Це можна зробити за допомогою SQL-запиту у phpMyAdmin:
SELECT table_name, engine
FROM information_schema.tables
WHERE table_schema = 'your_database_name'
ORDER BY engine, table_name;
Замініть your_database_name на назву вашої бази.
Результат запиту виглядатиме приблизно так:

🔄 Як змінити MyISAM на InnoDB
Розгляну декілька випадків та варіантів.
🧠 Як змінити тип однієї таблиці
Виконайте SQL-запит
ALTER TABLE назва_таблиці ENGINE=InnoDB;
Замініть назва_таблиці на назву конкретної таблиці вашої бази даних.
🧠 Як автоматизувати зміну типу для всіх таблиць
Варіанти зміни типу для декількох таблиць одночасно.
✅ Варіант 1: генерація ALTER-запитів для всіх MyISAM-таблиць
Наступний SQL-код згенерує список готових SQL-запитів, які можна виконати вручну.
SELECT CONCAT('ALTER TABLE `', table_name, '` ENGINE=InnoDB;') AS sql_statement
FROM information_schema.tables
WHERE table_schema = 'your_database_name' AND engine = 'MyISAM';
Замініть your_database_name на назву вашої бази.
В результаті:

Тепер скопіюйте увесь цей список рядків та виконайте їх в одному SQL-запиті.
до змісту ↑☑ Варіант 2: PHP-скрипт для автоматичної заміни (на прикладі WordPress)
Цей PHP-код проходить всіма таблицями вашої бази даних, перевіряє, який storage engine використовується (MyISAM чи ні), і автоматично змінює його на InnoDB, якщо це потрібно.
- Створіть окремий PHP-файл в корені вашого сайту (наприклад,
convert-to-innodb.php) та додайте у нього код
<?php
// convert-to-innodb.php
// Завантаження WordPress ядра
require_once __DIR__ . '/wp-load.php';
// Підключення до БД через $wpdb
global $wpdb;
// Отримання всіх таблиць у базі даних
$tables = $wpdb->get_results( "SHOW TABLE STATUS", ARRAY_A );
// Лічильник змінених таблиць
$converted = 0;
echo "<h2>Конвертація MyISAM → InnoDB</h2>";
echo "<table border='1' cellpadding='6' cellspacing='0'>";
echo "<tr><th>Таблиця</th><th>Рушій</th><th>Статус</th></tr>";
foreach ( $tables as $table ) {
$table_name = $table['Name'];
$engine = $table['Engine'];
if ( strtoupper( $engine ) === 'MYISAM' ) {
$sql = "ALTER TABLE `$table_name` ENGINE=InnoDB";
$result = $wpdb->query( $sql );
if ( $result !== false ) {
$converted++;
echo "<tr><td>{$table_name}</td><td>MyISAM → InnoDB</td><td style='color:green;'>✔ Успішно</td></tr>";
} else {
echo "<tr><td>{$table_name}</td><td>MyISAM</td><td style='color:red;'>✖ Помилка</td></tr>";
}
} else {
echo "<tr><td>{$table_name}</td><td>{$engine}</td><td>– Пропущено</td></tr>";
}
}
echo "</table>";
echo "<p><strong>Готово. Конвертовано таблиць: {$converted}</strong></p>";
- У браузері відкрийте
https://ваш-домен.com/convert-to-innodb.php
Результат роботи скрипту — таблиця з інформацією які таблиці було змінено, які пропущено.

- Видаліть файл.
