MySQL 8.0 リファレンスマニュアル


15.9.1.2 圧縮テーブルの作成

圧縮テーブルは、file-per-table テーブルスペースまたは general tablespaces で作成できます。 テーブル圧縮は、InnoDB system tablespace では使用できません。 システムテーブルスペース (領域 0、.ibdata files) には、ユーザーが作成したテーブルを含めることができますが、圧縮されない内部システムデータも含まれます。 したがって、圧縮は file-per-table または general テーブルスペースに格納されているテーブル (およびインデックス) にのみ適用されます。

File-Per-Table テーブルスペースでの圧縮テーブルの作成

file-per-table テーブルスペースに圧縮テーブルを作成するには、innodb_file_per_table を有効にする必要があります (デフォルト)。 このパラメータは、MySQL 構成ファイル (my.cnf または my.ini) で設定するか、SET ステートメントを使用して動的に設定できます。

innodb_file_per_table オプションの構成後、CREATE TABLE ステートメントまたは ALTER TABLE ステートメントで ROW_FORMAT=COMPRESSED 句または KEY_BLOCK_SIZE 句 (あるいはその両方) を指定して、file-per-table テーブルスペースに圧縮テーブルを作成します。

たとえば、次のステートメントを使用できます:

SET GLOBAL innodb_file_per_table=1;
CREATE TABLE t1
 (c1 INT PRIMARY KEY)
 ROW_FORMAT=COMPRESSED
 KEY_BLOCK_SIZE=8;
一般テーブルスペースでの圧縮テーブルの作成

一般的なテーブルスペースに圧縮テーブルを作成するには、テーブルスペースの作成時に指定される一般的なテーブルスペースに対して FILE_BLOCK_SIZE を定義する必要があります。 FILE_BLOCK_SIZE 値は、innodb_page_size 値に関連する有効な圧縮ページサイズである必要があり、CREATE TABLE または ALTER TABLE KEY_BLOCK_SIZE 句で定義された圧縮テーブルのページサイズは FILE_BLOCK_SIZE/1024 と同じである必要があります。 たとえば、innodb_page_size=16384 および FILE_BLOCK_SIZE=8192 の場合、テーブルの KEY_BLOCK_SIZE は 8 である必要があります。 詳細は、セクション15.6.3.3「一般テーブルスペース」を参照してください。

次の例は、一般的なテーブルスペースの作成および圧縮テーブルの追加を示しています。 この例では、デフォルトの innodb_page_size が 16K であると想定しています。 8192 の FILE_BLOCK_SIZE では、圧縮テーブルの KEY_BLOCK_SIZE が 8 である必要があります。

mysql> CREATE TABLESPACE `ts2` ADD DATAFILE 'ts2.ibd' FILE_BLOCK_SIZE = 8192 Engine=InnoDB;

mysql> CREATE TABLE t4 (c1 INT PRIMARY KEY) TABLESPACE ts2 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
メモ
  • MySQL 8.0 では、圧縮テーブルのテーブルスペースファイルは InnoDB ページサイズではなく物理ページサイズを使用して作成されるため、空の圧縮テーブルのテーブルスペースファイルの初期サイズは以前の MySQL リリースより小さくなります。

  • ROW_FORMAT=COMPRESSED を指定する場合は、KEY_BLOCK_SIZE を省略できます。KEY_BLOCK_SIZE 設定のデフォルトは innodb_page_size 値の半分です。

  • 有効な KEY_BLOCK_SIZE 値を指定する場合は、ROW_FORMAT=COMPRESSED を省略できます。圧縮は自動的に有効になります。

  • KEY_BLOCK_SIZE,の最適な値を決定するには、通常、この句に異なる値を指定して同じテーブルの複数のコピーを作成し、生成される .ibd ファイルのサイズを測定して、各ファイルが現実的な workload でどのように動作するかを確認します。 一般的なテーブルスペースの場合、テーブルを削除しても、一般的なテーブルスペースの .ibd ファイルのサイズが小さくなることはなく、ディスク領域がオペレーティングシステムに戻されることもないことに注意してください。 詳細は、セクション15.6.3.3「一般テーブルスペース」を参照してください。

  • KEY_BLOCK_SIZE 値は、ヒントとして処理されます。InnoDB では、必要に応じて異なるサイズが使用される可能性があります。 file-per-table テーブルスペースの場合、KEY_BLOCK_SIZEinnodb_page_size 値以下にのみできます。 innodb_page_size 値を超える値を指定した場合は、指定された値が無視され、警告が発行されます。また、KEY_BLOCK_SIZEinnodb_page_size 値の半分に設定されます。 innodb_strict_mode=ON の場合、無効な KEY_BLOCK_SIZE 値を指定するとエラーが返されます。 一般的なテーブルスペースの場合、有効な KEY_BLOCK_SIZE 値はテーブルスペースの FILE_BLOCK_SIZE 設定によって異なります。 詳細は、セクション15.6.3.3「一般テーブルスペース」を参照してください。

  • InnoDB は 32KB および 64KB のページサイズをサポートしていますが、これらのページサイズは圧縮をサポートしていません。 詳細は、innodb_page_size のドキュメントを参照してください。

  • InnoDB データページのデフォルトの非圧縮サイズは、16K バイトです。 オプション値の組合せに応じて、MySQL では、テーブルスペースデータファイル (.ibd ファイル) に 1KB、2KB、4KB、8KB または 16KB のページサイズが使用されます。 実際の圧縮アルゴリズムは、KEY_BLOCK_SIZE 値の影響を受けません。この値によって、各圧縮済みチャンクの大きさが決定されるため、各圧縮済みページに詰め込むことができる行数が影響を受けます。

  • file-per-table テーブルスペースに圧縮テーブルを作成する場合、KEY_BLOCK_SIZEInnoDB page size と同等に設定しても、通常は圧縮があまり発生しません。 たとえば、InnoDB のページサイズは 16K バイトであるため、一般に KEY_BLOCK_SIZE=16 を設定しても、大量の圧縮は発生しません。 多くの場合、このような値で適切に圧縮されるため、この設定は多くの長い BLOBVARCHAR、または TEXT カラムを持つテーブルで引き続き役立つことがあります。したがって、セクション15.9.1.5「InnoDB テーブルでの圧縮の動作」で説明したように、必要となるオーバーフローページが少なくなる可能性もあります。 一般的なテーブルスペースの場合、InnoDB ページサイズと等しい KEY_BLOCK_SIZE 値は許可されません。 詳細は、セクション15.6.3.3「一般テーブルスペース」を参照してください。

  • テーブルのすべてのインデックス (クラスタ化されたインデックスを含む) は、CREATE TABLE または ALTER TABLE ステートメントで指定されたものと同じページサイズを使用して圧縮されます。 ROW_FORMATKEY_BLOCK_SIZE などのテーブル属性は、InnoDB テーブルの CREATE INDEX 構文の一部ではなく、指定されている場合は無視されます (ただし、指定されている場合は SHOW CREATE TABLE ステートメントの出力に表示されます)。

  • パフォーマンス関連の構成オプションについては、セクション15.9.1.3「InnoDB テーブルの圧縮の調整」 を参照してください。

圧縮テーブル上の制約
  • 圧縮テーブルは、InnoDB システムテーブルスペースに格納できません。

  • 一般テーブルスペースには複数のテーブルを含めることができますが、圧縮テーブルと非圧縮テーブルを同じ一般テーブルスペース内に共存させることはできません。

  • 句の名前が ROW_FORMAT であるにもかかわらず、圧縮は個別の行にではなく、テーブル全体およびそれに関連付けられたすべてのインデックスに適用されます。

  • InnoDB では、圧縮一時テーブルはサポートされていません。 innodb_strict_mode が有効な場合 (デフォルト)、ROW_FORMAT=COMPRESSED または KEY_BLOCK_SIZE が指定されていると、CREATE TEMPORARY TABLE はエラーを返します。 innodb_strict_mode が無効な場合は、警告が発行され、圧縮されていない行形式を使用して一時テーブルが作成されます。 一時テーブルに対する ALTER TABLE 操作にも同じ制限が適用されます。


関連キーワード:  InnoDB, テーブル, 圧縮, スペース, SIZE, BLOCK, 作成, KEY, 構成, 一般