2026年6月26日

2026年6月26日

WordPressのデータベースを最適化する方法

はじめに

WordPressを長期間運用すると、削除した投稿のリビジョン・スパムコメント・期限切れトランジェントなどがデータベースに蓄積し、クエリが遅くなります。定期的な最適化でサイトの表示速度を改善できます。

症状・原因

  • 管理画面や記事ページの表示が遅くなってきた
  • phpMyAdminでテーブルに「オーバーヘッド」が表示されている
  • wp_optionsテーブルが数万行に膨れ上がっている
  • 投稿リビジョンが大量に蓄積している

解決手順

ステップ1:データベースの現状を確認する

# WP-CLI でデータベースサイズと概要を確認
wp db size --tables
wp db size --format=table

# テーブルごとのサイズ(MB単位)
wp db query "SELECT table_name,
    ROUND(data_length/1024/1024, 2) AS data_MB,
    ROUND(index_length/1024/1024, 2) AS index_MB,
    ROUND(data_free/1024/1024, 2) AS overhead_MB
    FROM information_schema.tables
    WHERE table_schema = DATABASE()
    ORDER BY (data_length + index_length) DESC;"

# 投稿リビジョン数を確認
wp post list --post_type=revision --format=count

# 期限切れトランジェント数を確認
wp db query "SELECT COUNT(*) FROM wp_options WHERE option_name LIKE '_transient_%';"

ステップ2:不要データを削除する

# WP-CLI で不要データを一括削除

# ① 投稿リビジョンを削除
wp post delete $(wp post list --post_type=revision --field=ID --format=ids) --force
# または一括削除
wp db query "DELETE FROM wp_posts WHERE post_type = 'revision';"

# ② スパムコメントと削除済みコメントを削除
wp comment delete $(wp comment list --status=spam --field=comment_ID --format=ids) --force
wp comment delete $(wp comment list --status=trash --field=comment_ID --format=ids) --force

# ③ 期限切れトランジェントを削除
wp transient delete --expired
# 全トランジェント削除(注意:キャッシュが消える)
# wp transient delete --all

# ④ 孤立したポストメタを削除
wp db query "DELETE pm FROM wp_postmeta pm
    LEFT JOIN wp_posts p ON pm.post_id = p.ID
    WHERE p.ID IS NULL;"

# ⑤ 孤立したコメントメタを削除
wp db query "DELETE cm FROM wp_commentmeta cm
    LEFT JOIN wp_comments c ON cm.comment_id = c.comment_ID
    WHERE c.comment_ID IS NULL;"

ステップ3:テーブルを最適化する

# WP-CLI でテーブルの最適化(OPTIMIZE TABLE)
wp db optimize

# 特定テーブルのみ最適化
wp db query "OPTIMIZE TABLE wp_posts, wp_postmeta, wp_options, wp_comments;"

# phpMyAdmin での手順:
# 1. データベースを選択
# 2. 「テーブルを選択」→「すべてチェック」
# 3. 「選択したものを」→「テーブルを最適化する」を実行

ステップ4:リビジョンを自動制限する

// wp-config.php: リビジョン保存数を制限
define('WP_POST_REVISIONS', 3); // 最新3件のみ保持
// define('WP_POST_REVISIONS', false); // リビジョン無効化

// functions.php: 自動保存間隔を延長(デフォルト60秒)
define('AUTOSAVE_INTERVAL', 300); // 5分ごとに変更

ステップ5:定期的な自動最適化を設定する

// functions.php: 毎週自動でデータベースを最適化

add_action('weekly_db_optimize', 'run_db_optimization');

function run_db_optimization(): void {
    global $wpdb;

    // 期限切れトランジェントを削除
    $wpdb->query(
        "DELETE FROM {$wpdb->options}
         WHERE option_name LIKE '_transient_%'
           AND option_name LIKE '_transient_timeout_%'
           AND option_value < UNIX_TIMESTAMP()"
    );

    // 30日以上前のリビジョンを削除
    $wpdb->query(
        "DELETE FROM {$wpdb->posts}
         WHERE post_type = 'revision'
           AND post_modified < DATE_SUB(NOW(), INTERVAL 30 DAY)"
    );

    // テーブル最適化
    $tables = $wpdb->get_col("SHOW TABLES LIKE '{$wpdb->prefix}%'");
    foreach ($tables as $table) {
        $wpdb->query("OPTIMIZE TABLE `$table`");
    }

    update_option('last_db_optimize', current_time('mysql'));
}

if (!wp_next_scheduled('weekly_db_optimize')) {
    wp_schedule_event(time(), 'weekly', 'weekly_db_optimize');
}

注意事項

  • OPTIMIZE TABLE 実行中はテーブルがロックされ、一時的にサイトへのアクセスが遅くなります。アクセスの少ない深夜に実行することを推奨します
  • 全トランジェント削除(wp transient delete --all)はキャッシュを完全にクリアするため、直後はサイトが一時的に遅くなる場合があります
  • 最適化前には必ずデータベースのバックアップを取得してください

まとめ

データベース最適化は①wp db size --tablesで肥大化テーブルを特定、②wp post deletewp comment deletewp transient delete --expiredで不要データを削除、③wp db optimizeでOPTIMIZE TABLEを実行、④WP_POST_REVISIONS定数でリビジョン保存数を制限、⑤wp_schedule_eventで週次の自動最適化クロンを設定します。

お気軽にご相談ください

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