MySQLで大量データ削除後にはoptimize tableする
MySQLで大量データ削除後にはoptimize tableする
0.改訂履歴
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では,以下のような作業が行われる.
- 削除されたテーブルの領域や断片化されたレコードを修復
- インデックスの格納領域をソートする
- 統計情報を更新する
- 統計情報を更新するという部分では,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を実施中は,テーブルロックがかかるので注意する.