今回は、Optimize Tableについて紹介します。

RDSのMySQLでCloudWatchのFree Spaceに関するAlarmが出ることがあります。
これはRDSに限ったことではないですが、MySQLを運用しているとディスクスペースが減っていき、
データを削除してもディスク空き容量が増えないことが多々あるためです。
データを削除しても削除した箇所はフリースペースとして確保され、開放されないことが多く、
長い間放置しているとディスク容量を圧迫してしまいます。

このようなときには、MySQLのOptimizeを行います。

サンプルとしてtpcc-mysqlのデータを投入しておきます。

./tpcc_load 10.0.1.58 deflag memorycraft xxxxxxxxx 10

RDSでデータの多いテーブルの偶数行を削除します。

mysql> delete from order_line where ol_number % 2 = 0;
Query OK, 1417106 rows affected (45.03 sec)

削除して暫くしてもデータ空き容量が増えないため、Optimizeを行なってみます。

mysql> OPTIMIZE TABLE order_line;
+-------------------+----------+----------+-------------------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+-------------------+----------+----------+-------------------------------------------------------------------+
| deflag.order_line | optimize | note | Table does not support optimize, doing recreate + analyze instead |
| deflag.order_line | optimize | status | OK |
+-------------------+----------+----------+-------------------------------------------------------------------+
2 rows in set (57.53 sec)

Table does not support optimizeと表示されます。
MySQL 5.5 Reference Manualを見ると、InnoDBではOPTIMIZE TABLEはALTER TABLEにマップされると
書いてあります。
そのため、ALTER TABLEを行なっても最適化されるようです。

再度、いろいろなデータを削除してみます。

mysql> delete from stock where s_i_id % 2 = 0;
Query OK, 500000 rows affected (49.63 sec)


mysql> delete from order_line where ol_o_id % 2 = 0;
Query OK, 789689 rows affected (22.29 sec)


mysql> delete from customer where c_id % 2 = 0;
Query OK, 150000 rows affected (15.08 sec)

削除して暫くしてもやはり、データ空き容量は増えないので、今度はALTER TABLEを実施してみます。

mysql> ALTER TABLE order_line ENGINE=InnoDB;
Query OK, 790679 rows affected (31.92 sec)
Records: 790679 Duplicates: 0 Warnings: 0

mysql> ALTER TABLE customer ENGINE=InnoDB;
Query OK, 150000 rows affected (14.18 sec)
Records: 150000 Duplicates: 0 Warnings: 0

mysql> ALTER TABLE stock ENGINE=InnoDB;
Query OK, 500000 rows affected (30.85 sec)
Records: 500000 Duplicates: 0 Warnings: 0

少し時間を置いて、RDSのCloudWatchを確認します。

そうすると、OPTIMIZE TABLEやALTER TABLEをした時点で使用領域が開放され、
ディスク容量が増えていることがわかります。

ALTER TABLEのため、メンテナンス時間に行う必要がありますが、追加削除の頻度が高いDBでディスク容量を
増やすことが難しい場合には丁度よい対策になりますし、アクセスも高速になるため定期的に行った方が
良いかと思います。

Optimizeに関してはRDSに限ったことではないのですが、CloudWatchを使うとOptimize時期の目安にもなり
とても便利です。

こちらの記事はなかの人(memorycraft)監修のもと掲載しています。
元記事は、こちら