環境: MySQL 4.1 on Debian GNU/Linux Sarge
hogedb データベースの t_hoge テーブルに不要なデータがたくさんあったので、不要な一部のデータを削除してみる。
レコード削除の過程
mysql コマンドで。
全レコード数取得は速い。
mysql> select count(*) from t_hoge;
+----------+
| count(*) |
+----------+
| 189737 |
+----------+
1 row in set (0.00 sec)
条件に合うレコード数の取得は遅い。
MySQLの日付型で絞込み(20070701より前)。
mysql> select count(*) from t_hoge where cachedtime < 20070701;
+----------+
| count(*) |
+----------+
| 159082 |
+----------+
1 row in set (41.67 sec)
条件に合うレコードを削除するのは遅い。
MySQLの日付型で絞込み(20070701より前)。
mysql> delete from t_hoge where cachedtime < 20070701;
Query OK, 159080 rows affected (5 min 16.85 sec)
mysql> select count(*) from t_hoge where cachedtime < 20070701;
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (1 min 30.70 sec)
全レコード数取得は速い。
mysql> select count(*) from t_hoge;
+----------+
| count(*) |
+----------+
| 87485 |
+----------+
1 row in set (0.00 sec)
テーブルの最適化
レコードをたくさん削除したが、実際のデータベースのファイル(*.MYD とか *.MYI)のファイルサイズは小さくならなかった。
そこで、optimize table.
OPTIMIZE TABLE は、テーブルの大部分を削除したり、可変長レコードを持つテーブル(VARCHAR カラム、BLOB カラム、または TEXT カラムを持つテーブル)に多くの変更を加えた場合に使用します。 削除されたレコードはリンクされたリストに保持され、元のレコード位置は、後続の INSERT 操作により再利用されます。OPTIMIZE TABLE を使用して未使用領域を解放し、データファイルを最適化することができます。
ほとんどの場合、OPTIMIZE TABLE を実行する必要はありません。可変長レコードに更新を多く行う場合でも、週または月に一度、特定のテーブルだけに実行するだけで十分です。
現在のところ、OPTIMIZE TABLE は MyISAM テーブルと BDB テーブルにのみ有効です。BDB テーブルでは、OPTIMIZE TABLE は現在 ANALYZE TABLE にマップされます。
MySQL AB :: MySQL 4.1 リファレンスマニュアル :: 4.6.1 OPTIMIZE TABLE 構文
optimize table を実行。
mysql> optimize table t_hoge;
+-------------------+----------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+-------------------+----------+----------+----------+
| hogedb.t_hoge | optimize | status | OK |
+-------------------+----------+----------+----------+
1 row in set (1 min 25.11 sec)
optimize table 実行前。
# ls -la /var/lib/mysql/hogedb | grep hoge
-rw-rw---- 1 mysql mysql 1299050568 Jul 24 20:58 t_hoge.MYD
-rw-rw---- 1 mysql mysql 22189056 Jul 24 20:58 t_hoge.MYI
-rw-rw---- 1 mysql mysql 8678 Jan 7 2007 t_hoge.frm
optimize table 実行後。
# ls -la /var/lib/mysql/hogedb | grep hoge
-rw-rw---- 1 mysql mysql 502637068 Jul 24 21:03 t_hoge.MYD
-rw-rw---- 1 mysql mysql 8668160 Jul 24 21:03 t_hoge.MYI
-rw-rw---- 1 mysql mysql 8678 Jan 7 2007 t_hoge.frm
ファイルサイズがちゃんと減っている(^_^)
データベースのロックについて
ISAM/MyISAM および HEAP テーブルのテーブルロック、BDB テーブルのページレベルロック、InnoDB テーブルの行レベルロックのみが、MySQL で現在サポートされています。
MySQL AB :: MySQL 4.1 リファレンスマニュアル :: E.4 ロック方法
他の処理も同時に走らせてたけど、それがぜんぜん返ってこないと思ったら……
もしかしてテーブルロックされていたのでは? (((( ;゚Д゚))))ガクガクブルブル
-MySQL AB :: MySQL 4.1 リファレンスマニュアル :: 5.3.1 MySQL のテーブルロック方法
-MySQLの内部構造 - 2-10 ロック
-鈴木 啓修 著 / MySQL全機能リファレンス
tags: zlashdot Database MySQL
Posted by NI-Lab. (@nilab)