


Блог IT-шника
Блог IT-шника
Привіт:) У цьому гайді покроково покажу як змінити MyISAM на InnoDB та навіщо це потрібно.
У контексті СУБД MySQL (і її форків, таких як MariaDB), рушій зберігання даних (Storage Engines) — це модуль, який відповідає за фізичне збереження, читання та зміну даних у таблицях. Він визначає:
MySQL дозволяє використовувати різні рушії зберігання для різних таблиць в одній базі даних. Це одна з її унікальних переваг.
📌 Найпопулярніші рушії:
Характеристика | MyISAM | InnoDB |
---|---|---|
🚀 Швидкість читання | Висока | Висока |
💾 Швидкість запису | Вища для простих операцій | Оптимізована для паралельного запису |
🔐 Підтримка транзакцій | ❌ Немає | ✅ Повна підтримка (ACID) |
🔄 Автовідновлення при збоях | ❌ Обмежене | ✅ Так, підтримується |
🔗 Зовнішні ключі (FOREIGN KEY) | ❌ Немає | ✅ Так |
🔒 Блокування | Повне блокування таблиці | Блокування на рівні рядків |
📂 Файлова структура | Кожна таблиця → 3 файли (.frm, .MYD, .MYI) | Один .ibd-файл або загальне сховище |
🧩 Індекси повнотекстового пошуку | ✅ Підтримуються (раніше була перевага) | ✅ Підтримуються з MySQL 5.6+ |
🏗 Підтримка foreign constraints | ❌ Немає | ✅ Є |
📉 Масштабованість | Обмежена | Висока |
СУБД / Платформа | Підтримка рушіїв |
---|---|
MySQL | ✅ Основна СУБД, де активно використовуються |
MariaDB | ✅ Повністю сумісна з MySQL і має ті ж рушії |
Percona Server | ✅ Підтримує обидва та додаткові оптимізації |
BEGIN
, COMMIT
, ROLLBACK
.Причина | Пояснення |
---|---|
🔐 Безпечніші дані | InnoDB підтримує транзакції та відновлення після збоїв. |
⚡ Вища продуктивність | Блокування на рівні рядків, а не таблиць. |
🔄 Підтримка зовнішніх ключів | Можна створювати складні зв’язки між таблицями. |
✅ Сумісність із сучасними CMS | WordPress, Magento, Laravel — всі працюють краще з InnoDB. |
🔄 Поліпшення масштабування | InnoDB ефективніший на великих базах. |
Ви переносите старий сайт на новий хостинг. Сайт працює повільно під час великого трафіку. Перевірка таблиць показує: 10+ таблиць MyISAM. Після конвертації на InnoDB:
Це можна зробити за допомогою SQL-запиту у phpMyAdmin:
SELECT table_name, engine
FROM information_schema.tables
WHERE table_schema = 'your_database_name'
ORDER BY engine, table_name;
Замініть your_database_name
на назву вашої бази.
Результат запиту виглядатиме приблизно так:
Розгляну декілька випадків та варіантів.
Виконайте SQL-запит
ALTER TABLE назва_таблиці ENGINE=InnoDB;
Замініть назва_таблиці
на назву конкретної таблиці вашої бази даних.
Варіанти зміни типу для декількох таблиць одночасно.
Наступний 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-запиті.
до змісту ↑Цей PHP-код проходить всіма таблицями вашої бази даних, перевіряє, який storage engine використовується (MyISAM чи ні), і автоматично змінює його на InnoDB, якщо це потрібно.
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
Результат роботи скрипту — таблиця з інформацією які таблиці було змінено, які пропущено.