• 30日以上前に追加されたレコードを定期的(30分おき)に削除するスクリプト(Ruby+MySQL/Ruby)の結果(処理時間等)をグラフ化
  • データベースはMySQL MyISAMを使用
  • WebAPIの結果(XMLデータ)をキャッシュしている
  • http://www.nilab.info/ で使っているデータベース

期間は2011-04-18から2011-07-13あたり。
X軸が時間の流れ。右へ行くほど未来。
『レコード削除処理時間』のY軸は秒。

MySQL MyISAMのレコードを定期的に削除したときのレコード数・削除数・処理時間

(グラフはOpenOffice.orgで作成。すごく重かったのであまりきれいにしてない…たった2000レコードの処理なのに。X軸の数字はOpenOffice.org Calcの行番号なので気にしないこと)

  • レコード数は0からスタートして50万件あたりで停滞。30日間で50万パターンのWeb APIコールをしているということ。平均すると1日に16000コールぐらい。
  • レコード削除数ブレすぎ。時刻によってWeb APIコール数が偏る?パッと見では、100~300レコードずつ削除している。30分間で100~300パターンのWeb APIコールをしているということに。
  • レコード削除処理時間。全体的にはゆるやかに処理時間が増えている。たまには optimize table したほうがいいかも。
ほとんどの設定で、OPTIMIZE TABLE を利用する必要は全くありません。可変長行の更新を頻繁にするとしても、特定のテーブルに対してだけ、この作業を週に一度、または月に一度以上する必要はありません。
(中略)
MyISAM テーブルに対しては、OPTIMIZE TABLE は次のように機能します。
1. もしテーブルが行を削除したり分割したりすると、テーブルを修復します。
2. もしインデックス ページがソートされていなければ、それらをソートします。
3. もしテーブルの統計が最新でなければ、(そしてインデックスをソートする事で修復が完了されなければ)それらを更新します。

MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.5.2.5 OPTIMIZE TABLE 構文

環境:
- Debin GNU/Linux Lenny
- MySQL 5.0 MyISAM
- Ruby 1.8.7
- MySQL/Ruby 2.7.4

計測期間にHDD障害とかいろいろあったのできれいなデータにはならないけど、いちおう参考程度に。

Ref.
- ヅラッシュ! - MySQLのテーブルから大量のデータを削除
- ヅラッシュ! - Debian lenny GNU/Linux で MySQL/Ruby を使う

tags: mysql

Posted by NI-Lab. (@nilab)