ワードプレスにおいて会員を10,000人以上ガッツリ削除するときはusermetaテーブルを最適化すること

当ページのリンクには広告が含まれています。

旦那デスノートが使っているXSEVERが、やっとKUSANAGIサーバーに移行できました。少し前に、旦那デスノート以外のSNSをエックスサーバーのクサナギに移行して爆速だったことを書きました。
超絶爆速変化にビックリ! 会員数が2万人以上の古参XSERVER利用者は、今すぐにKUSANAGI新サーバーに移行するべき

クサナギへの移行は、データコピー申請をして5分くらいで、データコピー開始、30分くらいで新サーバーへ切り替えることが出来るようになります。

旦那デスノートがクサナギに移行出来なかった理由は、データベースが3.7ギガバイトもあったからです。エックスサーバーが提供している新サーバー移行システムは、データベースが2ギガバイト以内という制約があります。

3.7GBもあるデータベースで、最も容量が多いのは、2.9GBもあるusermetaテーブルです。会員数が多く、かつ、ベースシステムであるAsk-meにおいて、1人あたりに付属する情報が多いためです。

対策として、ログインしていないユーザーを完全に削除することにしました。やり方として、プラグインのWhen Last Loginを追加し、各ユーザーの最終ログイン日時を記録するようにします。1ヶ月ほど日時を記録したあと、会員登録日時の古い順に、ログインしていないユーザーを削除する、という方法です。

1ヶ月ほどたち、18,000人の会員を削除しました。クサナギサーバーに移行した結果でもありますが、2万人近いユーザーを削除しただけで、けっこうページ表示速度が速くなりました。

ここから、会員を削除するときのポイントです。あまり多くないかもしれませんが、ワードプレスを用いて、2万人以上の会員を抱えるSNS運営者の方は参考にしてみてください。

巨大だったusermetaテーブルは、会員情報が入っています。このテーブルは、ワードプレスの管理画面から会員を削除しても、容量は減りません。削除した会員情報もホコリとして残ります。会員情報を削除したあとに、データベースを最適化してあげる必要があります。

SQLを完全に理解していれば、userテーブルからwhereで繋いでusermetaを消せば良いかもしれませんが、私は怖いので挑戦しませんでした。また、userに紐付いているのはusermetaだけでは無いかもしれないからです。

ユーザーや記事を削除するときは、出来るだけ管理画面から削除した方が良いです。その方がトラブルは起きにくいと思います。

さて、会員を削除したあとのデータベースの最適化は、WP-Optimizeというプラグインを入れて対応します。データベーステーブルの最適化を実行すると、usermetaの容量が減ります。

usermetaテーブルの削減方法が理解できたら、会員の削除の仕方です。登録日時を古い順で並び替えて、最終ログイン時間を目で確認し、ログインしていなかったら削除する、という手順です。ここで怖いのが、目視で確認するログイン時間を見逃した場合です。

例えば、以下の画面を見て、瞬間的に「ログインしたことのある人」が判りますでしょうか。When Last Loginの列にNever以外の文字列があれば良いです。上から5番目の方がログインしたことのある人です。

パッと見、判りません。そこで、Javascript( jQuery )を使い、ログインしたことがあるユーザーの行の色を変える、かつ、一番左にある削除に使用するチェックボックスのチェックをさせない、にしました。

Simple Custom CSS and JSというプラグインを使っているので、Javascript、CSS、HTML読み込みなどは、テーマを触らずに外から設定、実行できます。以下、対策で書いたソースコードです。


jQuery(document).ready(function( $ ){

  let when_last_login = '.wp-admin.users-php .users td.column-when_last_login';
  
  	$( when_last_login + ":contains('時')," + 
       when_last_login + ":contains('日')," +
       when_last_login + ":contains('週')," +
       when_last_login + ":contains('月')" )
      .parent('tr').css( 'background', '#ffc4c4' );

  	$( when_last_login + ":contains('時')," + 
       when_last_login + ":contains('日')," +
       when_last_login + ":contains('週')," +
       when_last_login + ":contains('月')" )
      .prevAll('th').children( 'input[type="checkbox"]' ).prop( 'disabled', true );
});

when_last_loginの列において、時、日、週、月の文字を確認して、設定しています。見やすくなりました。

大量の会員を削除するときは、表示オプションから件数を増やして一気にやりましょう。件数を多くしすぎると、メモリオーバーで削除できません。私の環境の場合、memory_limitを2048Mにして、250件あたりが限界でした。300件にすると落ちます。

ブラウザのタブの数を増やして、同時削除数を増やす分には、落ちないです。件数を250件で、タブの数を4つにして、同時にやれば、1,000件ずつ削除することが出来ます。データベースの容量を確認しながら、1,000単位で削除していくと良いです。

以上の方法で、無事に会員を削除し、データベース容量を2ギガバイト以下にすることが出来ました。

エックスサーバーのクサナギに移行したあとに、気をつけることがあります。エックスサーバーからも注意として書かれていますが、クサナギに移行してから24時間はデータが不安定になります。というのも、24時間以内にサイトの更新をすると、更新する前に戻ったりします。

旦那デスノートの投稿が無くなっていたり、ソースコードを編集した部分が戻っていたりしました。クサナギに移行したあと、24時間はブログやサイトの更新は控えておいた方が良いです。

この記事を書いた人

旦那デスノートで実際に使っている、WordpressやPHPのコードなどを公開しています。公開しているものは、ネットには あまり載っていない、痒いところに手が届くような拡張です。
@koichiromakita2

コメント

コメントする