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 できないような仕様を控える
これが最適だと思った。



0 コメント:
コメントを投稿