こんにちは、yoku0825といいます。だいたいざっくり言うと、1) に近いです。ただし、ibdata1に空きスペースがあった場合はその空きスペースを使います。もし、ibdata1に500MBの空き容量が存在すれば、空き容量 + 新規600MBを使ってibdata1の増加は600MB、その後ibdata1の中に空き容量が1GB発生します。空き容量が全くなければibdata1は1.1GB増えて、その後空き容量が1GB発生します。ibdata1の空き容量はSHOW TABLE STATUSでなんとなく照会できます。mysql51> SHOW TABLE STATUS LIKE 't1'\G*************************** 1. row ***************************Name: t1Engine: InnoDBVersion: 10Row_format: CompactRows: 5000220Avg_row_length: 67Data_length: 338542592Max_data_length: 0Index_length: 83492864Data_free: 236978176 -- ココAuto_increment: NULLCreate_time: 2014-09-16 11:53:01Update_time: NULLCheck_time: NULLCollation: utf8_general_ciChecksum: NULLCreate_options:Comment:1 row in set (0.01 sec)yoku0825,2014年9月16日 11:24 Yuya Takeyama <sign.of.the.wolf.pentagram@gmail.com>:竹山と申します。
以下の状況で ALTER TABLE を実行したとき、ibdata1 の容量がどのように拡張されるかについての質問です。
MySQL のバージョン = 5.1
ストレージエンジン = InnoDB
innodb_file_per_table = 0
ここであるテーブルに ALTER TABLE でインデックスの追加を行いたいのですが、
(厳密には既存 UNIQUE KEY にカラムを追加)
データベース容量がやや苦しい状態となっており、どのように ibdata1 が拡張されるのか、気になっています。
例えば現状 1GB インデックスがあるとして、ALTER TABLE によって 1.1GB になったとき、
その 1.1GB はどこから確保されるのでしょうか。
こちらでは以下の 2 パターン予想しました。
---
1) ibdata1 上全く新たに 1.1GB 確保される
この場合データベース全体のサイズとしては 1.1GB 増えることになると思います。
2) 既存の 1GB が使いまわされた上で、0.1 GB は新たに確保される
この場合はデータベース全体のサイズとしては 0.1 GB 増えることになると思います。
---
根本的な解決としては innodb_file_per_table = 1 にしたうえでデータベース全体の再生成を行う予定ですが、
そちらはまだ先になりそうなので、とりあえずは少しでも容量を節約したい、とうい状態です。
この点についてご存知のどなたか、ご教示いただければ幸いです。
以上、よろしくお願いいたします。
---
Yuya Takeyama