圧縮テーブルを作成する前に、innodb_file_per_table
構成オプションが有効になっていること、およびinnodb_file_format
がBarracuda
に設定されていることを確認してください。これらのパラメータは、MySQL構成ファイルmy.cnf
またはmy.ini
で設定することも、MySQL サーバーをシャットダウンせずにSET
ステートメントを使用して設定することもできます。
テーブルの圧縮を有効にするには、CREATE TABLE
またはALTER TABLE
ステートメントでROW_FORMAT=COMPRESSED
句、KEY_BLOCK_SIZE
句、またはその両方を使用します。
圧縮テーブルを作成するには、次のようなステートメントを使用するとよいでしょう。
SET GLOBAL innodb_file_per_table=1; SET GLOBAL innodb_file_format=Barracuda; CREATE TABLE t1 (c1 INT PRIMARY KEY) ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
ROW_FORMAT=COMPRESSED
を指定する場合は、KEY_BLOCK_SIZE
を省略できます。innodb_page_size
値の半分であるデフォルトのページサイズ値が使用されます。KEY_BLOCK_SIZE
を指定する場合は、ROW_FORMAT=COMPRESSED
を省略できます。圧縮は自動的に有効になります。KEY_BLOCK_SIZE
の最適な値を決定するには、一般に、この句にさまざまな値を指定した同じテーブルのコピーをいくつか作成してから、結果として生成される.ibd
ファイルのサイズを計測し、現実的なワークロードで各動作のパフォーマンスを確認します。KEY_BLOCK_SIZE
値は、ヒントとして処理されます。InnoDB
では、必要に応じて異なるサイズが使用される可能性があります。値 0 は、innodb_page_size
値の半分であるデフォルトの圧縮済みページサイズを表します。KEY_BLOCK_SIZE
は、innodb_page_size
値以下にしかできません。innodb_page_size
値を超える値を指定した場合は、指定された値が無視され、警告が発行されます。また、KEY_BLOCK_SIZE
はinnodb_page_size
値の半分に設定されます。innodb_strict_mode=ON
の場合、無効なKEY_BLOCK_SIZE
値を指定するとエラーが返されます。パフォーマンス関連の追加の構成オプションについては、セクション14.7.3「InnoDB テーブルの圧縮の調整」を参照してください。
InnoDB
データページのデフォルトの非圧縮サイズは、16K バイトです。オプション値の組み合わせに応じて、MySQL ではテーブルの.ibd
ファイルに対応した 1K バイト、2K バイト、4K バイト、8K バイト、または 16K バイトのページサイズが使用されます。実際の圧縮アルゴリズムは、KEY_BLOCK_SIZE
値の影響を受けません。この値によって、各圧縮済みチャンクの大きさが決定されるため、各圧縮済みページに詰め込むことができる行数が影響を受けます。
一般に、KEY_BLOCK_SIZE
をInnoDB
のページサイズに等しい値に設定しても、大量の圧縮は発生しません。たとえば、InnoDB
のページサイズは 16K バイトであるため、一般にKEY_BLOCK_SIZE=16
を設定しても、大量の圧縮は発生しません。多くの場合、このような値で適切に圧縮されるため、この設定は多くの長いBLOB
、VARCHAR
、またはTEXT
カラムを持つテーブルで引き続き役立つことがあります。したがって、セクション14.7.5「InnoDB テーブルでの圧縮の動作」で説明したように、必要となるオーバーフローページが少なくなる可能性もあります。
テーブルのすべてのインデックス (クラスタ化されたインデックスを含む) は、CREATE TABLE
またはALTER TABLE
ステートメントで指定されたものと同じページサイズを使用して圧縮されます。ROW_FORMAT
やKEY_BLOCK_SIZE
などのテーブル属性は、InnoDB
テーブルのCREATE INDEX
構文の一部ではないため、指定しても無視されます (ただし、SHOW CREATE TABLE
ステートメントの出力には表示されます)。
圧縮テーブル上の制約
バージョン 5.1 よりも前の MySQL では圧縮テーブルを処理できないため、圧縮を使用するには、偶然に互換性の問題が発生することを回避するために、innodb_file_format=Barracuda
構成パラメータを指定する必要があります。
テーブルの圧縮は、InnoDB のシステムテーブルスペースでも使用できません。システムテーブルスペース (スペース 0、ibdata*
ファイル) にはユーザーデータを含めることができますが、内部システム情報も含まれているため、圧縮されません。そのため、圧縮は独自のテーブルスペースに格納されているテーブル (およびインデックス) にのみ適用されます。つまり、innodb_file_per_table
オプションが有効になっている状態で作成されます。
句の名前がROW_FORMAT
であるにもかかわらず、圧縮は個別の行にではなく、テーブル全体およびそれに関連付けられたすべてのインデックスに適用されます。