このエントリーをブックマークに追加 このエントリをlivedoorクリップに追加 Yahoo!ブックマークに登録

MySQLにて大量のデータのDELETEが重い。

2008年8月22日金曜日 by mikuta

MySQLにて大量のデータのDELETEが重い。

下記は実際の例。

mysql> describe `tableName`;
+-------------+--------------+------+-----+
| Field | Type | Null | Key |
+-------------+--------------+------+-----+
| url | varchar(255) | NO | PRI |
| cookie | varchar(255) | NO | MUL |
| user_agent | varchar(255) | NO | MUL |
| http_header | text | NO | |
| html | mediumblob | NO | |
| created | datetime | NO | MUL |
| deleted | datetime | NO | MUL |
+-------------+--------------+------+-----+
7 rows in set (0.02 sec)

mysql> select count(*) from `tableName`;
+----------+
| count(*) |
+----------+
| 164252 |
+----------+
1 row in set (0.00 sec)

mysql> select count(*) from `tableName`
where url like 'http://www.google.co.jp/%';
+----------+
| count(*) |
+----------+
| 22053 |
+----------+
1 row in set (6.23 sec)

mysql> delete from `tableName`
where url like 'http://www.google.co.jp/%';

・・・・・・・・・終わらない。。。

キャッシュのようなデータなので結局これで対応した。

mysql> TRUNCATE TABLE `tableName`;
Query OK, 0 rows affected (3.72 sec)

でも、一気に消せないデータならどう対応すればいいのだろう。
いろいろ調べて有用そうなものを・・。

・where節の「like」の代わりに「REGEXP」が使えないか検討
 (試してみたけど、likeの方が場合によっては数倍早い)

・パーティショニング(パーティション)の使用
 http://dev.mysql.com/doc/refman/5.1/ja/partitioning.html

・インデックスキャッシュ(KEY_BUFFER_SIZE)のサイズを拡大する
 http://dev.mysql.com/doc/refman/4.1/ja/server-parameters.html

・TRUNCATE TABLE できないような仕様を控える
 これが最適だと思った。

Filed under having  

0 コメント: