2026年5月20日
2026年5月20日
WordPressの孤立したメタデータを削除してDBを軽くする方法
はじめに
WordPressを長期間運用していると、削除された投稿・ユーザー・コメントに紐づいていた「孤立メタデータ」がデータベースに蓄積します。これらは参照される機会がなく、ディスク容量を無駄に消費するだけです。定期的な掃除でDBを軽量化しましょう。
孤立メタデータとは
| テーブル | 主テーブル | 孤立の発生タイミング |
|----------|-----------|-------------------|
| wp_postmeta | wp_posts | 投稿を削除時にメタが残る場合 |
| wp_usermeta | wp_users | ユーザー削除時にメタが残る場合 |
| wp_commentmeta | wp_comments | コメント削除時にメタが残る場合 |
通常WordPressは投稿削除時にメタも一緒に削除しますが、プラグインが直接SQLで投稿を削除した場合や、プラグインのアンインストール時に残骸が残ることがあります。
削除手順
wp_postmeta の孤立データを削除
-- 孤立したpostmetaを確認
SELECT COUNT(*) FROM wp_postmeta pm
LEFT JOIN wp_posts p ON pm.post_id = p.ID
WHERE p.ID IS NULL;
-- 孤立したpostmetaを削除
DELETE pm FROM wp_postmeta pm
LEFT JOIN wp_posts p ON pm.post_id = p.ID
WHERE p.ID IS NULL;
wp_usermeta の孤立データを削除
-- 孤立したusermetaを削除
DELETE um FROM wp_usermeta um
LEFT JOIN wp_users u ON um.user_id = u.ID
WHERE u.ID IS NULL;
wp_commentmeta の孤立データを削除
-- 孤立したcommentmetaを削除
DELETE cm FROM wp_commentmeta cm
LEFT JOIN wp_comments c ON cm.comment_id = c.comment_ID
WHERE c.comment_ID IS NULL;
WP-CLIで実行
# カスタムSQLをWP-CLIで実行
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;"
# DBサイズを確認
wp db size
# OPTIMIZE TABLE で断片化を解消
wp db optimize
特定プラグインが残したメタを削除
# プラグインが残したメタキーを確認(例:old-plugin)
wp post meta list 0 --meta-key=_old_plugin_setting 2>/dev/null
# 特定のメタキーをすべての投稿から削除
wp db query "DELETE FROM wp_postmeta WHERE meta_key LIKE '_old_plugin_%';"
安全に実行するためのチェックリスト
1. バックアップを取る — 削除前に必ずDBバックアップ
2. 本番前にステージングで確認 — 削除するレコード数を SELECT COUNT(*) で確認
3. アクセスの少ない時間帯に実行 — OPTIMIZE TABLE はテーブルロックが発生
4. プラグインのメタキーを把握 — 誤って有効なメタを削除しないよう確認
OPTIMIZE TABLE でテーブルを最適化
削除後はテーブルに断片化が生じるため、最適化を実行します。
# WP-CLI で全テーブルを最適化
wp db optimize
# または特定テーブルのみ
wp db query "OPTIMIZE TABLE wp_postmeta, wp_usermeta, wp_commentmeta;"
注意事項
DELETE ... LEFT JOIN ... WHERE p.ID IS NULLは本番環境では必ず事前にSELECT COUNT(*)で件数確認してから実行してください- 一部のプラグイン(WooCommerce・ACF等)は
post_id=0に設定値を保存する場合があります。WHERE p.ID IS NULLはこれを巻き込む可能性があるため、AND pm.post_id != 0を条件に追加することも検討してください
まとめ
孤立メタデータは LEFT JOIN + WHERE IS NULL のSQLパターンで特定・削除できます。削除後は wp db optimize でテーブルを最適化することでDBのパフォーマンスが向上します。定期的なメンテナンスとして月1回程度実施することをおすすめします。