読者です 読者をやめる 読者になる 読者になる

データベースのテーブルの情報をDELETEするのは時間がかかる

SELECT、INSERT、UPDATE、DELETE、みんな個性があるけれど、知らなかったDELETE文の遅さということで、そんな話です。

ことの始まりはWordPressの管理画面にログインできない

Microsoft Azure上にアップしていたWordPressの管理画面にログインしようとすると、何回やってもログイン画面にリダイレクトしてしまうという現象が起きました。

原因は、データベースの許容量以上にデータが入っていたために起こっていたようです。

ということで、データを削除するために、MySQL Workbenchを使ってデータベースに接続し、テーブルのレコード(データ)をDELETE文で削除してみました。

DELETE文を実行したけれど

DELETE文を実行してpostテーブルのレコード(900件ぐらい登録)を400件ぐらい削除して、SELECT文でpostテーブルを表示すると、400件分のレコードは無くなっていました。

改めて、WordPress管理画面のログインを試みるも、ログイン画面にリダイレクト!

慌てすぎは良くない、ということで10分後、再度試すも弾き返されるさまよえる蒼い弾丸、そのあと10回ぐらい連続でログインを試みるもすべてリダイレクト!なんでや!データ消したやんけ~、かくしてその日はログインを断念。

翌朝、ログイン成功

翌朝、真っ先にログインを試みるとあっさり成功!な、なんで~?

時がすべてを解決する、ってことですか?みたいな感じでモヤモヤさまぁ~ず的モヤモヤ感を抱えていて日々を過ごします。

翌日、職場の方にお聞きしたところ、な、なんと目から鱗な話を教えていただけました! 

DELETE文は時間がかかる

データベースの性能にもよりますが、データをDELETE文で処理する場合、DELETE文を実行すると、データをすぐに消すのではなく、まずはログファイルにデータの内容などを記録していくため実際にデータが削除されるまでには時間がかかるとのこと。

よく、レンタルサーバーなどで「『sv1~sv4.php、sv1~sv4.wpサーバー』12/26 AM5:00頃~AM8:00頃にかけて5分~15分程度のサーバー停止を伴うシステムメンテナンスについて」 サーバーを一時的に止めるのは、データベース内で不要になったデータなどをDELETEするのには時間がかかるからという理由もありそうです。

ログあれこれ

データベースによってログが異なるようです。

mysqlのログはバイナリログと言いまして、mysql-bin.xxxというファイルに出力されます。この部分は、ibm db2ですと、アーカイヴログ、oracle ですと、redo ログという部分です。ちなみに、デフォルトの設定ですと、mysqlバイナリログを出力しません。

MySQL: 意外と知らない?障害発生時の復旧方法について | QK

 

DELETE文はコストが高い

400件のデータでも、DELETE文で相当に時間がかかることが分かり、大規模なシステムなどで10万件ぐらいのデータを消したりするときってどのぐらい時間がかかるんだろうと、ゾッとした次第です。 

⇩  ハイウォーターマークについては下記サイトへ

Oracleで大量データのinsertとdeleteを繰り返すと遅くなる理由 - 大人になったら肺呼吸

広告を非表示にする