

`OPTIMIZE TABLE`は「行を`DELETE`して無駄な領域がたくさん生じたとき時だけで良い」と聞きました。

[大人のためのInnoDBテーブルとの正しい付き合い方。](http://nippondanji.blogspot.jp/2010/09/innodb.html)

例えば`DELETE`と`INSERT`が同数頻繁に行われ、行数が一定な新陳代謝の高いテーブルがあるとします。この時、`OPTIMIZE
TABLE`は必要あるでしょうか？

`DELETE`によって生じた無駄な領域が`INSERT`によって新しい行に上書きされるのか、`OPTIMIZE
TABLE`するまで永遠に使用可能にならないのか、あるいはそれ以外なのかよく分からず、こういう疑問が出ました。


CC BY-SA 4.0
2015-05-22T06:24:38.087
10494
2022-07-25T05:07:30.683
2021-03-19T01:23:57.397
3060
3922
question
mysql
MySQLにおけるOPTIMIZE TABLEの仕組み


例えば以下の記事の解説が詳しいです。ざっくり言うと…

  * `DELETE` で削除を行った場合、一時的に "歯抜け" な状態にはなるが、その後永久に再利用されないわけではない。
  * 大量の `DELETE` を実行した後でフラグメンテーションが懸念されるなら、`OPTIMIZE TABLE` の実行でパフォーマンス改善やディスク領域の確保が見込める。

[第35回 OPTIMIZE
TABLEでテーブルを最適化する：MySQL道普請便り](https://gihyo.jp/dev/serial/01/mysql-road-
construction-news/0035)

> ### DELETE構文で削除した場合
>
> DELETE構文を使って全件削除を行いました。 (中略) ファイルサイズが変化していないことがわかります。
>
> ### TRUNCATE 構文で削除した場合
>
>
> データ削除にはDELETE構文の他にもTRUNCATE構文があります。こちらを使ってテーブルの一括削除を行った場合は話が変わって，自動的にディスク領域が解放されます。
>
> ### OPTIMIZE TABLEを実行してみる
>
>
> さて前項のDELETE構文を使ってデータを削除した場合，データベースから削除しているにもかかわらず，ディスク領域が解放されていないことがわかります。実際には確保している領域をInnoDBが使い回して再利用してくれるのですが，このように一度に大量の削除が走った後はどうしてもフラグメンテーションが発生してしまいます。そんな時にデータ領域を最適化したい場合には，OPTIMIZE
> TABLEを使用します。

[MySQLの物理削除によるパフォーマンスの悪化とその回避策について](https://techblog.yahoo.co.jp/entry/2020052530001949/)

> 断片化されたテーブルで、欠番状態のレコードが選択されて統計情報が更新され、極端なパフォーマンスの悪化が発生していたと考えられます。  
>  (中略)  
>  テーブルが格納された物理ファイル内の空間が実体のあるレコードのみとなるように再構築する事でクエリのパフォーマンスが改善しました。


CC BY-SA 4.0
2021-03-19T01:39:34.257
74751
2021-03-19T01:39:34.257
3060
10494
answer