Як змінити MyISAM на InnoDB: повний гайд

Привіт:) У цьому гайді покроково покажу як змінити MyISAM на InnoDB та навіщо це потрібно.

📚 Що таке MyISAM та InnoDB

У контексті СУБД MySQL (і її форків, таких як MariaDB), рушій зберігання даних (Storage Engines) — це модуль, який відповідає за фізичне збереження, читання та зміну даних у таблицях. Він визначає:

  • як таблиця буде організована на диску;
  • як відбувається доступ до даних;
  • як працюють індекси, блокування, транзакції тощо.

MySQL дозволяє використовувати різні рушії зберігання для різних таблиць в одній базі даних. Це одна з її унікальних переваг.

📌 Найпопулярніші рушії:

  • InnoDB — сучасний стандарт;
  • MyISAM — застарілий, але досі трапляється;
  • MEMORY, ARCHIVE, CSV, FEDERATED — для специфічних задач.
У PostgreSQL, SQLite, MSSQL, Oracle немає такого поняття як змінювані storage engines — це особливість саме MySQL/MariaDB.
до змісту ↑

🆚 Детальне порівняння: MyISAM vs InnoDB

ХарактеристикаMyISAMInnoDB
🚀 Швидкість читанняВисокаВисока
💾 Швидкість записуВища для простих операційОптимізована для паралельного запису
🔐 Підтримка транзакцій❌ Немає✅ Повна підтримка (ACID)
🔄 Автовідновлення при збоях❌ Обмежене✅ Так, підтримується
🔗 Зовнішні ключі (FOREIGN KEY)❌ Немає✅ Так
🔒 БлокуванняПовне блокування таблиціБлокування на рівні рядків
📂 Файлова структураКожна таблиця → 3 файли (.frm, .MYD, .MYI)Один .ibd-файл або загальне сховище
🧩 Індекси повнотекстового пошуку✅ Підтримуються (раніше була перевага)✅ Підтримуються з MySQL 5.6+
🏗 Підтримка foreign constraints❌ Немає✅ Є
📉 МасштабованістьОбмеженаВисока
до змісту ↑

🏛 Де використовуються MyISAM та InnoDB?

СУБД / ПлатформаПідтримка рушіїв
MySQL✅ Основна СУБД, де активно використовуються
MariaDB✅ Повністю сумісна з MySQL і має ті ж рушії
Percona Server✅ Підтримує обидва та додаткові оптимізації
🔔 У сучасних версіях MySQL (5.5+) InnoDB використовується як стандартний (default) рушій.
до змісту ↑

🔥 Чому MyISAM вже не рекомендований?

  • Немає відновлення після збою — при аварійному завершенні MyISAM-таблиці легко пошкоджуються.
  • Відсутність транзакцій — неможливо виконати BEGIN, COMMIT, ROLLBACK.
  • Повне блокування таблиць — не підходить для високонавантажених сайтів.
  • Складне масштабування — великі об’єми даних працюють повільніше.
Якщо ваш сайт на WordPress або інша CMS працює на MyISAM — однозначно варто змінити на InnoDB.
до змісту ↑

📌 Чому варто перейти з MyISAM на InnoDB

ПричинаПояснення
🔐 Безпечніші даніInnoDB підтримує транзакції та відновлення після збоїв.
⚡ Вища продуктивністьБлокування на рівні рядків, а не таблиць.
🔄 Підтримка зовнішніх ключівМожна створювати складні зв’язки між таблицями.
✅ Сумісність із сучасними CMSWordPress, 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

Розгляну декілька випадків та варіантів.

Зробіть повну резервну копію бази даних та файлів сайту (як це зробити для сайту WordPress).

🧠 Як змінити тип однієї таблиці

Виконайте SQL-запит

ALTER TABLE назва_таблиці ENGINE=InnoDB;

Замініть назва_таблиці на назву конкретної таблиці вашої бази даних.

Цей запит потрібно виконати для кожної MyISAM таблиці окремо.

🧠 Як автоматизувати зміну типу для всіх таблиць

Варіанти зміни типу для декількох таблиць одночасно.

✅ Варіант 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, якщо це потрібно.

  1. Створіть окремий 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>";
  1. У браузері відкрийте
https://ваш-домен.com/convert-to-innodb.php

Результат роботи скрипту — таблиця з інформацією які таблиці було змінено, які пропущено.

  1. Видаліть файл.
Деякі WordPress плагіни можуть створювати таблиці типу MyISAM. А тому після встановлення нового плагіну або його оновлення перевіряйте тип всіх таблиць знову.

Михайло Петров
Михайло Петров

Мене звати Михайло. Я — WordPress-розробник. Створюю візитки, корпоративні сайти, блоги на WordPress.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *