UJP - 技術情報1

Life is fun and easy!

不正IP報告数

Okan Sensor
 
メイン
ログイン
ブログ カテゴリ一覧

MySQLで大量データ削除後にはoptimize tableする

MySQLで大量データ削除後にはoptimize tableする


0.改訂履歴

  • 2007.07.25 新規作成

1.はじめに

 このドキュメントでは,optimize tableの実行とその効果について確認する一連の手順を説明する. なお,使用しているOSは,RedHat Linux ES上で稼働している.MySQLのMyISAMデータベースエンジンは削除処理が苦手とされているが,大量のデータを削除した時に空いた領域を旨く使うことができない. よって,それを最適化するために,optimize tableを実行して効果を見てみる.

2.現在の状態

  • 2800万件のテーブルの殆どのデータを削除したテーブルがある.
  • select count(*)してみた.
[root@neptune ]: >select count(*) from APPDB.history;
+----------+
| count(*) |
+----------+
| 124227 | 
+----------+
1 row in set (4 hours 53 min 20.27 sec)

[root@neptune ]: >
  • 約5時間かかっている. ちなみに,この間,データベースへの他のユーザアクセスがない状態.
  • この原因は,MySQLにてデータの大量削除を行った際,断片化が起こっている事が原因である.

3.optimize tableを実行してみる.

  • optimize tableでは,以下のような作業が行われる.
    1. 削除されたテーブルの領域や断片化されたレコードを修復
    2. インデックスの格納領域をソートする
    3. 統計情報を更新する
  • 統計情報を更新するという部分では,analyze tableを実施しているのと同等となる.
  • optimize tableは,MySQL4.1ではMyISAMとBDBにしか対応していないので注意.
  • 先ほどのテーブルに対して,optimize tableを実行してみる.
[root@neptune ]: >optimize table APPDB.history;
+---------------+----------+----------+----------+
| Table         | Op       | Msg_type | Msg_text |
+---------------+----------+----------+----------+
| APPDB.history | optimize | status   | OK       | 
+---------------+----------+----------+----------+
1 row in set (52.42 sec)

[root@neptune ]: >
  • ステータスがOKで終了している.
  • 再度,select count(*)を実施してみる.
[root@neptune ]: >select count(*) from APPDB.history;
+----------+
| count(*) |
+----------+
|   124227 | 
+----------+
1 row in set (0.00 sec)

[root@neptune ]: >
  • 一瞬で作業完了.
  • optimize tableを実施中は,テーブルロックがかかるので注意する.


広告スペース
Google