MySQLでTRUNCATEは必要だった

 開発環境のデカイデータが入ったMySQLのInnoDBテーブルをまるごと削除した。
 TRUNCATEはSQL:2008で標準になった割と新しいヤツなので、ORMで直接関数呼び出しになって互換性無しなんで、DELETEで削除してみたんだけど、削除済みテーブルの挙動がアレ?だった。

アレ?

 って事で、インフォメーションを見ると、DELETEしても領域がそのまま。  領域がクリアされないので、ストレージ使用量が減らない。 TRUNCATEすると減る。 ちなみに、DELETEして空になったテーブルにTRUNCATEしても更に削除が走る。
 で、パフォーマンスの話は、インデックス領域も消えていない事が原因。  0行のテーブルにインデックスだけ残っているので、フルスキャンすると0行が帰ってきて速いが、集計関数でインデックスが選ばれるとインデックス処理が走る、と言う事だった。 と言う事で、開発環境とかでMySQLデータの全削除をするときは、依存でもTRUNCATEを呼ぼう。

(41)


カテゴリー: LAMP[Linux, Apache, MySQL, PHP]   パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です