今回はさらっとオプティマイズの話です。
RDSのMySQLでCloudWatchのFree Spaceに関するAlarmがでることがあります。
RDSに限ったことではないですが、MySQLを運用しているとディスクスペースが減っていき、データをDeleteしてもディスク空き容量が増えないことが多くあります。
データを削除しても、削除した箇所はフリースペースとして確保され、開放されないことが多く、長い間放置しているとディスク容量を圧迫してしまいます。
このようなときには、MySQLのOptimizeを行います。
サンプルとしてtpcc-mysqlのデータを投入しておきます。
RDSでデータの多いテーブルの偶数行を削除します。
削除してしばらくしてもデータ空き容量は増えないため、Optimizeを行なってみます。
"Table does not support optimize"と表示されます。
ドキュメントを見ると、InnoDBではOPTIMIZE TABLEはALTER TABLEにマップされると書いてあります。
そのため、ALTER TABLEを行なっても最適化されるようです。
再びいろいろデータを削除してみます。
削除してしばらくしてもやはり、データ空き容量は増えません。
今度はALTER TABLEをしてみます。
少し待って、RDSのCloudWatchを見てみます。
すると、OPTIMIZE TABLEやALTER TABLEをした時点で使用領域が開放され、ディスク容量が増えているのがわかります。
ALTER TABLEなのでメンテナンス時間に行う必要がありますが、
追加削除の頻度が高いDBで、ディスク容量を増やすことが難しい場合には丁度よい対策になりますし、アクセスも高速になるため定期的におこなった方がよいかと思います。
オプティマイズに関してはRDSに限ったことではないのですが、CloudWatchを使うとオプティマイズ時期の目安にもなりとても便利です。
以上です。