2026年6月20日
2026年6月20日
WordPressのInnoDBとMyISAMの違い|エンジンの確認とInnoDBへの変換手順
MySQL と MariaDB では、テーブルごとに「ストレージエンジン」という、データの保存方法を選べます。WordPress でよく話題になるのは InnoDB と MyISAM の2つです。古いサーバーで作ったサイトや、古いデータベースから移したサイトでは、MyISAM のテーブルが残っていることがあります。この記事では、両者の違いと、InnoDB へ変換する手順を説明します。内容は 2026年11月時点の MySQL 8.4 の公式マニュアルと WordPress.org の情報で確認しています。
InnoDB と MyISAM の違い
| 項目 | InnoDB | MyISAM |
|---|---|---|
| 現在の MySQL での扱い | 既定のエンジン(MySQL 5.5 以降) | 古いエンジン。新しく使う理由はほとんどない |
| トランザクション | あり(COMMIT・ROLLBACK) |
なし |
| ロックの単位 | 行単位。書き込み中も他の行は読み書きできる | テーブル単位。書き込み中はテーブル全体が待たされる |
| 異常終了からの復旧 | ログを使って自動で復旧する | テーブルが壊れて修復が必要になることがある |
| 外部キー | 使える | 使えない |
| 全文検索(FULLTEXT) | MySQL 5.6 以降は使える | 使える |
| ディスク使用量 | MyISAM より多い | 少ない |
WordPress のように、投稿・コメント・オプション・セッションの書き込みが同時に起こるサイトでは、テーブル単位でロックする MyISAM は、アクセスが増えると待ち時間の原因になります。サーバーが突然止まったときにテーブルが壊れにくい点でも、InnoDB が向いています。
WordPress 本体は、テーブルを作るときにエンジンを指定せず、データベースの既定のエンジンを使います。WordPress.org が推奨する環境は MySQL 8.0 以上または MariaDB 10.11 以上で、どちらも既定は InnoDB です。いま新しく作ったサイトなら、通常はすべて InnoDB になっています。
1. 現在のエンジンを確認する
phpMyAdmin の「SQL」タブか、mysql コマンドで次を実行します。DB名 は wp-config.php の DB_NAME の値に置き換えます。
SELECT TABLE_NAME, ENGINE
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'DB名'
ORDER BY ENGINE, TABLE_NAME;
エンジンごとの数だけを見るなら、次のようにします。
SELECT ENGINE, COUNT(*) AS tables
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'DB名'
GROUP BY ENGINE;
SSH と WP-CLI が使える場合は、WordPress のフォルダーで次のように実行できます。wp db query は wp-config.php の接続情報を使うので、パスワードを入力する必要がありません。
wp db query "SELECT TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() ORDER BY ENGINE;"
phpMyAdmin では、データベースを選んだときのテーブル一覧の「種別」の列でもエンジンを確認できます。SHOW TABLES; はテーブル名しか表示しないので、エンジンの確認には使えません。
2. 変換の前に準備する
- バックアップを取る: データベース全体をエクスポートしておきます。手順は WordPressのデータベースをバックアップする方法 を参照してください。
- ディスクの空きを確かめる:
ALTER TABLEはテーブルを作り直すため、変換中は元のテーブルと新しいテーブルの両方の容量が必要です。InnoDB は MyISAM より多くの容量を使います。 - アクセスの少ない時間に行う: 変換中のテーブルは書き込みが待たされます。大きなテーブル(投稿やコメントが多いサイトの
wp_posts・wp_postmeta・wp_commentsなど)は時間がかかります。 - 共用サーバーの場合: エンジンの変更を許可していないサーバーもあります。エラーになったらサーバー会社の案内を確認してください。
3. 1つのテーブルを InnoDB に変換する
ALTER TABLE wp_posts ENGINE=InnoDB;
テーブル名の wp_ は、wp-config.php の $table_prefix の値です。違う接頭辞を使っている場合は読み替えてください。
4. MyISAM のテーブルをまとめて変換する
テーブルが多い場合は、変換の文を SQL で作ってから実行します。次の SQL は、指定したデータベースの MyISAM のテーブルだけを対象に、ALTER TABLE の文を一覧にします。
SELECT CONCAT('ALTER TABLE `', TABLE_NAME, '` ENGINE=InnoDB;') AS sql_to_run
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'DB名'
AND ENGINE = 'MyISAM';
この SQL は文を表示するだけで、変換はしません。表示された文をコピーし、もう一度 SQL として実行します。1つずつ実行すると、どのテーブルで失敗したかが分かりやすくなります。
WP-CLI が使える場合は、シェルで次のように順番に変換することもできます。
for t in $(wp db query "SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND ENGINE = 'MyISAM';" --skip-column-names); do
echo "converting $t"
wp db query "ALTER TABLE \`$t\` ENGINE=InnoDB;"
done
5. 変換後に確かめる
手順 1 の SQL をもう一度実行し、MyISAM のテーブルが残っていないことを確認します。そのあと、次を確かめます。
- サイトの表示、ログイン、投稿の保存、コメントの投稿ができる
- 使っているプラグインの画面でエラーが出ていない
プラグインが独自に作ったテーブルの中には、MyISAM 前提で作られたものが残っていることがあります。変換後にそのプラグインで不具合が出た場合は、プラグインの説明書や開発元の案内を確認してください。
サーバーの設定も見直す(VPS・専用サーバー)
MyISAM のテーブルが無くなったら、MySQL の設定も InnoDB 向けに直せます。MySQL の公式マニュアルでは、次のように案内されています。
- MyISAM 用のキャッシュである
key_buffer_sizeは小さくしてよい - InnoDB がデータと索引を読み込んでおく
innodb_buffer_pool_sizeを大きくする(MyISAM から変換するときの目安として、システムのメモリの50〜75%が示されている。Web サーバーと同じ機械で動かす場合は、PHP などが使うメモリを残す)
設定の詳しい調整は MySQLのInnoDBを最適化する方法 で説明しています。共用サーバーではこれらの設定は変えられません。