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 delete・wp comment delete・wp transient delete --expiredで不要データを削除、③wp db optimizeでOPTIMIZE TABLEを実行、④WP_POST_REVISIONS定数でリビジョン保存数を制限、⑤wp_schedule_eventで週次の自動最適化クロンを設定します。