どーもこんにちは、黒ブタです。
今日はデータベースに溜まった不要なレコード(列)の削除をしていきたいと思う。
というのも、現在扱っているホームページのデータがあるのですが、更新するタイプで古いデータ(全く使用していないデータ)がなんと数千万件存在していました。
重くなっている原因の一因の可能性もある為、データベースの整理を行うことにしました。
※ 知識のないものがデータベースをむやみやたらにイジクルととんでもないことになる為、そういう方は絶対にデータベースを触ってはいけません!
と、そんなこんなで、しこしこphpmyadminで列の削除を行っていたのですが、一度に削除できる件数が限度5000件程度、時間にして5000件削除するのに5分くらいかかります。
消したい列数は3000万件オーバーなので、とんでもなく効率が悪い・・・・と言うことで、別の方法を考えることにしました。
以前にSQL文について勉強していた時期もあり、機能を使うよりSQL文使って列の削除をした方が早いんじゃないか?と思い立ち、指定削除をちょろっと調べたら簡単に見つかりました。
前に勉強していたこともあり、構文を見て簡単に理解できたのでサクッと使うことにしました。
実際に使ってみたら30万件削除するのに1分ちょっとかかりました。
5000件削除に5分かかっていた時より遥かに前進!効率もいいですね。
まだ余裕がありそうだったので、一桁繰り上げ一度に300万件をやろうと思ったが止まってしまいました・・・。
少しづつ件数を減らし、処理できる限界(スムーズに)が30万件でしたので、それで進めていきます。
思っていたよりもサクサクデータ(レコード削除)出来ましたのでホクホクです♪
使用した構文は
DELETE FROM wp_postmeta LIMIT 300000;
wp_postmetaというテーブルの中の列30万件を指定して削除するという構文です。
LIMITが指定構文ですね。
と、データベースについてわからない人の為に構造を書いときます。
データベースはツリー状の形態です。
データベース
・テーブル
テーブルの中にさらに列(レコード)が存在します。
テーブル
・列(レコード)
そして、列(レコード)を形成するカラムが存在します。
カラムに値を入れることによって一つのレコードが出来上がります。
こんな感じの構造になっています。
もちろん列に値を入れる為のカラムを作成しないといけませんが、今回はそれについては書きません。
さて、実践。
まずデータベース名がそれぞれあるとします。
今回は3つのデータベースがあると仮定
・test
・商品(items)
・在庫(zaiko)
今回使うデータベースは商品(items)とします。
商品(items)の中には
・野菜(vegetables)
・果物(fruit)
・その他
といったテーブルがあるとします。
使用するのは果物(fruit)
果物テーブルの中には複数の列があります。
1 いちご
2 ブドウ
3 バナナ
4 リンゴ
5 ゴリラ
その中の使わなくなったデータ・・・今回は古い順ということで1〜3番を削除します。
指定構文は
DELETE FROM fruit LIMIT 3;
結果残ったのは
1 リンゴ
2 ゴリラ
となります。