黒ブタBLOG

データベースの列の件数指定削除の方法 | MySQL構文

どーもこんにちは、黒ブタです。
今日はデータベースに溜まった不要なレコード(列)の削除をしていきたいと思う。

というのも、現在扱っているホームページのデータがあるのですが、更新するタイプで古いデータ(全く使用していないデータ)がなんと数千万件存在していました。
重くなっている原因の一因の可能性もある為、データベースの整理を行うことにしました。

※ 知識のないものがデータベースをむやみやたらにイジクルととんでもないことになる為、そういう方は絶対にデータベースを触ってはいけません!

と、そんなこんなで、しこしこ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 ゴリラ

となります。