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


15.9.1.1 テーブル圧縮の概要

プロセッサおよびキャッシュメモリーは、ディスクストレージデバイスよりも速度が上昇しているため、多くのワークロードがディスクバウンドになります。 データ圧縮を使用すると、データベースのサイズが小さくなり、I/O が削減され、スループットが改善されますが、CPU 使用率が上昇するという少しの犠牲が伴います。 圧縮は、頻繁に使用されるデータをメモリー内に保持するために十分な RAM が搭載されたシステム上で、読み取り負荷の高いアプリケーションを実行する際に、特に有効です。

ROW_FORMAT=COMPRESSED で作成された InnoDB テーブルでは、構成された innodb_page_size 値より小さいディスク上の page size を使用できます。 ページが小さいほど、ディスクから読み取られる I/O とディスクに書き込まれる I/O が少なくなるため、SSD デバイスを使用する際に、特に有効です。

圧縮されたページサイズは、CREATE TABLE または ALTER TABLE KEY_BLOCK_SIZE パラメータを使用して指定します。 システムテーブルスペースに圧縮テーブルを格納できないため、異なるページサイズでは、テーブルを system tablespace ではなく file-per-table テーブルスペースまたは general tablespace に配置する必要があります。 詳細は、セクション15.6.3.2「File-Per-Table テーブルスペース」およびセクション15.6.3.3「一般テーブルスペース」を参照してください。

圧縮レベルは、KEY_BLOCK_SIZE の値に関係なく同じです。 KEY_BLOCK_SIZE に小さい値を指定するほど、徐々にページが小さくなるという I/O の利点が得られます。 ただし、小さすぎる値を指定すると、各ページ内に複数の行を収容できるほど十分にデータ値を圧縮できない場合に、ページを再編成するための追加のオーバーヘッドが発生します。 そのインデックスごとのキーカラムの長さに基づいて、どのくらい小さい KEY_BLOCK_SIZE をテーブルに指定できるのかについて、ハード制限が課されています。 小さすぎる値を指定すると、CREATE TABLE または ALTER TABLE ステートメントが失敗します。

バッファープールには、圧縮済みデータが KEY_BLOCK_SIZE の値に基づいたページサイズの小さなページで保持されます。 MySQL では、カラム値を抽出または更新するために、圧縮されていないデータを含む未圧縮のページもバッファプールに作成されます。 バッファープール内では、非圧縮ページへの更新が同等の圧縮済みページに再度書き込まれます。 圧縮済みページと非圧縮ページの両方の追加データが収容されるように、バッファーページのサイズを変更する必要がある場合もあります。ただし、非圧縮のページは、領域が必要になるとバッファープールから解放され、次のアクセス時に再度圧縮が解除されます。


関連キーワード:  InnoDB, テーブル, 圧縮, 構成, ページ, スペース, インデックス, ロック, プール, INFORMATION