WordPressという巨大なエコシステムの中で、最も「見えないところで悲鳴を上げている」場所、それがデータベースです。
特に`wp_posts`や`wp_postmeta`は、記事を保存するたび、メタデータを更新するたびに書き換えられます。今回は、このデータベースの「断片化(フラグメンテーション)」という、初心者が見落としがちな、しかしシステムを重くする最大の要因について、その本質と対策を解説します。
—
1. なぜWordPressのDBは「穴だらけ」になるのか?
想像してみてください。あなたは巨大な本棚を持っていて、そこに本を詰め込んでいます。
WordPressがデータを保存するエンジンであるInnoDBは、この本棚を整理する際、ある程度の「余白」を残して本を並べます。
- 削除・更新の代償: 記事を削除したり、メタデータを頻繁に更新すると、本棚には「ぽっかり空いた空間(空き領域)」ができます。
- 断片化の発生: 新しいデータを書き込む際、その空きスペースが小さすぎて収まらない場合、エンジンは別の場所にデータを書き込みます。これが繰り返されると、データが物理的に離散し、読み込み時にディスクヘッドがあちこちへ移動する「断片化」という現象が起きます。
これが、サイトのレスポンスが徐々に悪化する「沈黙の犯人」です。
—
2. 断片化を検知する(SQLの深淵)
まずは、自分のサイトのデータベースがどれくらい「無駄」を抱えているか確認しましょう。WordPressの管理画面からは見えませんが、MySQLクライアント(phpMyAdminやターミナル)で以下のクエリを投げることで、その実態が分かります。
— 対象データベースのテーブルごとの断片化状況を確認
SELECT
table_name,
round(data_length / 1024 / 1024, 2) AS data_mb,
round(data_free / 1024 / 1024, 2) AS free_mb — これが断片化による「空き領域」
FROM information_schema.tables
WHERE table_schema = ‘あなたのデータベース名’;
`free_mb`の値が大きいほど、そのテーブルは整理整頓が必要です。
—
3. オンライン最適化:サービスを止めない魔法
一般的に「テーブル最適化」と聞くと、`OPTIMIZE TABLE`コマンドを思い浮かべるでしょう。しかし、これはテーブル全体をロックするため、実行中にサイトがフリーズします。
そこで、WordPressのコアコントリビューターが現場で使うのは、「ALTER TABLE … ENGINE=InnoDB」というテクニックです。
なぜこれが有効なのか?
InnoDBにおいて、同じエンジンを指定してALTER文を投げると、MySQLは「テーブルを再構築して、断片化を物理的に詰め直す」という処理を、オンライン(読み取りを許可した状態)で行ってくれるからです。
現場で使える最適化コード例
/
function optimize_wordpress_table_safely($table_name) {
global $wpdb;
// プレフィックスを考慮してフルテーブル名を取得
$full_table_name = $wpdb->prefix . $table_name;
// 安全装置: 存在確認
if ($wpdb->get_var(“SHOW TABLES LIKE ‘$full_table_name'”) !== $full_table_name) {
return;
}
// オンライン再構築を実行
// ENGINE=InnoDB を再指定することで物理的にデフラグされる
$result = $wpdb->query(“ALTER TABLE $full_table_name ENGINE=InnoDB”);
if ($result !== false) {
error_log(“最適化成功: {$full_table_name}”);
}
}
// 注意: 高頻度で実行してはいけません。月1回、cronで十分です。
// optimize_wordpress_table_safely(‘posts’);
—
4. 陥りやすい罠:やってはいけないこと
初心者の方がやりがちなミスとして、「全てのテーブルに対して毎分cronで最適化を回す」というものがあります。
- 負荷の増大: `OPTIMIZE`や`ALTER`はディスクI/Oを激しく消費します。頻繁に行うと、最適化自体が原因でサイトが重くなります。
- InnoDBの特性: InnoDBは、ある程度の空き領域をあえて残すことで、将来の書き込み性能を維持しようとします。完全に0%を目指す必要はありません。
—
5. まとめ:WordPressを掌握するために
ここをクリアすれば、あなたはもう「プラグインを入れるだけのユーザー」ではありません。
1. 定期的な監視: `information_schema`を使って、自分のデータベースの「無駄」を可視化する。
2. 適切なタイミング: ユーザーのアクセスが少ない時間帯に、`ALTER TABLE`で静かに最適化を行う。
3. 本質を見抜く: WordPressはPHPのコードだけでなく、その下の「データがどう物理的に格納されているか」までを意識した時、真の高速化が実現できます。
データベースは生き物です。適切にケアをすれば、WordPressはどこまでも高速に、安定して動き続けます。さあ、次はあなたの環境で、`free_mb`の数値を覗いてみることから始めてみてくださいね。応援しています。