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を最適化する方法 で説明しています。共用サーバーではこれらの設定は変えられません。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲