開発環境のデカイデータが入ったMySQLのInnoDBテーブルをまるごと削除した。
TRUNCATEはSQL:2008で標準になった割と新しいヤツなので、ORMで直接関数呼び出しになって互換性無しなんで、DELETEで削除してみたんだけど、削除済みテーブルの挙動がアレ?だった。
1 2 3 4 5 6 |
>DELETE FROM table; Query OK, 6540826 rows affected (24 min 18.03 sec) >SELECT * FROM table; 0 row in set (0.01 sec) >SELECT COUNT(*) FROM table; 1 row in set (1 min 27.41 sec) |
アレ?
1 2 3 4 5 6 |
>TRUNCATE TABLE table; Query OK, 0 rows affected (58.04 sec) >SELECT * FROM table; 0 row in set (0.01 sec) >SELECT COUNT(*) FROM table; 1 row in set (0.01 sec) |
って事で、インフォメーションを見ると、DELETEしても領域がそのまま。 領域がクリアされないので、ストレージ使用量が減らない。 TRUNCATEすると減る。 ちなみに、DELETEして空になったテーブルにTRUNCATEしても更に削除が走る。
で、パフォーマンスの話は、インデックス領域も消えていない事が原因。 0行のテーブルにインデックスだけ残っているので、フルスキャンすると0行が帰ってきて速いが、集計関数でインデックスが選ばれるとインデックス処理が走る、と言う事だった。 と言う事で、開発環境とかでMySQLデータの全削除をするときは、依存でもTRUNCATEを呼ぼう。
(147)