WordPressのデータベースを手動で最適化して軽量化! お掃除!

WordPressは、DBの状態に結構影響を受ける。
なので「遅いかな? 調子悪いかな?」と思ったら、1回お掃除することをオススメする。

このお掃除、プラグインで最適化ツールを入れたら良いということは解っている。

しかしプラグインって、使っているとジワジワ増えません?
無効化するにしても、たまの1回のために置いておきたくないし、いっぱいあるし、後日使おうと思ったらプラグイン名忘れてるし。

あとね…SQLite使っているんですよ!

なので、プラグインを使うことなく、お掃除しようぜ!という情報集めです。
別のデータベースでも使える情報ではあるよ!

まずは事前準備!

データベースを直接いじるのであるから、もしものときがないとは限らない。

バックアップ

忘れちゃいけないバックアップ。
し忘れた場合、もしもの場合戻せない。大事!
めんどくさければ、プラグインを使うでもいいけど、それなら最適化も使おうよ。

メンテナンスモード

公開中の物を変更する場合、WordPressのインストールディレクトリに『.maintenance』置いて『メンテナンスモード』にしておくことをオススメする。
終了後はこのファイルを削除しないと、公開状態に戻せないので忘れずに消すこと!
めんどくさければ、プラグインを使えばいいけど、それなら最適化にも使って…

テーブルを掃除する

「使っていない情報を消していこう!」という発想の掃除対象。
消えても問題ない情報だけを出している…ハズ!
※自己責任ですよ! バックアップは必須ですよ!

wp_post

基本的には投稿データやカスタムメニューが保存される。
プラグインによっては別の内容が保存されることも。
個人的には消すより、『post_type=post』、『post_status=private』にして残す方をオススメする。

リビジョン

記事の修正する都度保存されるもの。個人的にはこの機能自体不要と思っている。(キリ

DELETE FROM wp_posts WHERE post_type = 'revision';
継承

リビジョンとほぼ同じ。基本的にリビションを消したら消えるかと。

DELETE FROM wp_posts WHERE post_status = 'inherit';
ゴミ箱

記事を『削除』してもゴミ箱に入っている。

DELETE FROM wp_posts WHERE post_status = 'trash';
自動下書き

プラグインで使っていることもあるから、直接テーブル見て、問題ないことを確認してから消すことをオススメする。

DELETE FROM wp_posts WHERE post_status = 'auto-draft';

wp_postmeta

『wp_post』に関連する内容が保存される。
例えば『wp_posts』にカスタムフィールドを追加すると『wp_postmeta』テーブルにデータが追加される。

スラッグ変更履歴

アクセスとか見ていて、やはりスラッグを変えようと思うこともある。
その履歴がこのデータ。

DELETE FROM wp_postmeta WHERE meta_key = '_wp_old_slug';
複数ユーザーの同時編集の防止用データ

自動的に出来るのだが、自動的に消えるかは怪しいとの噂。

DELETE FROM wp_postmeta WHERE meta_key = '_edit_lock'; 
DELETE FROM wp_postmeta WHERE meta_key = '_edit_last';
重複したデータ

WordPressのwp_postmetaテーブルを掃除する - がとらぼによると、post_id、meta_key、meta_value全て重複したデータが出来ることがあるらしい。
その場合、IDが最小のものだけ残して消す。
自分はなかったし、参照元に書いてあるのは、MySQLだけだから、ここにSQLは記載しない。ご容赦!

投稿をゴミ箱に入れた履歴

捨てた記録…要るかなぁ…と。

DELETE FROM wp_postmeta WHERE meta_key LIKE '%wp_trash_meta%';
カスタムメニュー消した後に残ったゴミ

もし『カスタムメニューを消したなら』、残しておいても無意味なので消す。
消してなければ、そのままに!

DELETE FROM wp_postmeta WHERE meta_key LIKE '%_menu_item_%';
meta_key=_oembed_XXXX、meta_value={{unknown}}

「oEmbed」機能で自動で作成されるデータ。
消してもアクセスしたら出来るから無駄だけど、重複しているのもあるし掃除のために消しても良い。

DELETE FROM wp_postmeta WHERE meta_value = '{{unknown}}';

重複したものだけ消したいなら

delete from wp_postmeta
 where meta_value = '{{unknown}}' and (
  meta_id not in (
   select min_id from (
    select min(meta_id) as min_id from wp_postmeta where meta_value = '{{unknown}}' group by post_id
   )
  )
 );

だと思う…。
※自己責任

YoutubeやTwitterの自動埋め込みを使わないなら、切ってしまってもよいかと。

remove_filter( 'the_content', array( $GLOBALS['wp_embed'], 'autoembed' ), 8 );

wp_postmetaテーブルの「_oembed_ {{unknown}}」というデータは削除してもよいのか? – ブログ運営のためのブログカスタマイズ

wp_comments

記事に対するコメント。完全削除していれば基本的には気にしなくていい。

スパム

スパムを削除したら無くなるハズではある。

DELETE FROM wp_comments WHERE wp_comments.comment_approved = 'spam';

wp_commentmeta

コメントのメタデータ。

Akismetプラグイン関連

このプラグイン、データをモリモリ作るので、個人的には好きではない。
使っていなくて関連データ全てを消すなら

DELETE FROM wp_commentmeta WHERE meta_key LIKE '%akismet%';

使っている人でも『akismet_history(対応内容の記録)』は消していいと思う。

消したコメントのメタ情報

スパム等で消したコメントのメタが残っている場合消す。
基本的には消したら消える。

DELETE FROM wp_commentmeta WHERE comment_id NOT IN (SELECT comment_id FROM wp_comments);
コメントをゴミ箱に入れた履歴

捨てた記録…要るかな? スパム等ゴミ箱になど次々入れるっつの。
基本的にはゴミ箱から消したら消える。

DELETE FROM wp_commentmeta WHERE meta_key LIKE '%wp_trash_meta%';

wp_options

wordpressのオプション。
カスタムメニューの設定とかさ、こっちに書いてくれれば良くない?
postは違うだろよ~と思っている。

一時的なデータ

キャッシュデータを掃除する。

DELETE FROM wp_options WHERE option_name LIKE '%_transient_%';

番号を振り直す

次々データ作るから、数字は増えるし、番号も飛び飛び。

meta_idデータに紐付けられた情報は、通常ない。
同様にoption_idも紐付けが、通常はない。
だから番号を振り直しても、通常は問題ない。
消した後はsqlite_sequence (AUTOINCREMENT) を消す。

ただ、プラグインによってはわからないので、絶対は保証出来ない。
なのでスゴく自己責任です!

update wp_options 
set option_id = (SELECT COUNT(*) FROM wp_options temp2 WHERE wp_options.option_id >= temp2.option_id)
where wp_options.option_id >= option_id;

update wp_postmeta 
set meta_id = (SELECT COUNT(*) FROM wp_postmeta temp2 WHERE wp_postmeta.meta_id >= temp2.meta_id)
where wp_postmeta.meta_id >= meta_id;

update wp_commentmeta 
set meta_id = (SELECT COUNT(*) FROM wp_commentmeta temp2 WHERE wp_commentmeta.meta_id >= temp2.meta_id)
where wp_commentmeta.meta_id >= meta_id;

DELETE FROM sqlite_sequence;

sqlite_sequenceは個別に消す方が安全。

DELETE FROM sqlite_sequence WHERE name = 'wp_options';

不要なテーブルを消す

最低限、WordPressを動かすのに必要なテーブルは下記。

  • wp_commentmeta
  • wp_comments
  • wp_links
  • wp_options
  • wp_postmeta
  • wp_posts
  • wp_registration_log
  • wp_signups
  • wp_site
  • wp_sitemeta
  • wp_term_relationships
  • wp_term_taxonomy
  • wp_termmeta
  • wp_terms
  • wp_usermeta
  • wp_users

他はプラグインやテンプレートなど、必要に応じて作られたもの。
なので、使わなくなったら消してもいいのだ。
『wp_ktaisession』なんてあったけど、いつから使っていないのだろう…

データベースをデフラグ

データを削除することで断片化が進んでいるので、1回整える。

MySQLなら下記を実行すれば、断片化解消が出来る。

ALTER TABLE テーブル名 ENGINE=INNODB

SQLiteなら下記を参照に、デフラグしてください。
SQLiteファイルをデフラグする
あくまでテーブルの掃除終了後に、デフラグしないと意味がないぞ!

コメント

タイトルとURLをコピーしました