以下の理由により、「innodb_file_format」を「Antelope」から「Barracuda」bcozに変更しました。
ファイル形式の変更を行っているときに、「動的」として「row_format」を選択しました。これは正常に機能しています。
しかし、データ圧縮のために「row_format」を「dynamic」から「compressed」に変更したいと思います。誰か教えてもらえますか
DYNAMICまたはCOMPRESSEDを使用すると、InnoDBは、ページに完全に収まらないvarchar/text/blobフィールドをページ外に格納します。ただし、列ごとに20バイトしかカウントされない列を除いて、InnoDBの行サイズの制限は変更されていません。それでも、1行あたり約8000バイトに制限されています。
InnoDBは、列あたり767バイトのインデックスのみをサポートします。 innodb_large_prefix=1
を設定し、DYNAMICまたはCOMPRESSED行形式を使用することで、この3072バイトを増やすことができます。
COMPRESSED行形式を使用しても、InnoDBはより長いインデックスをサポートしません。
パフォーマンスに関しては、これは「状況によって異なります」というケースの1つです。圧縮は通常、ストレージサイズと、圧縮および解凍するCPU負荷との間のトレードオフです。これは圧縮データを処理するためにもう少しCPUを必要とすることは事実ですが、データベースサーバーは通常I/Oを待機しており、CPUリソースに余裕があることを覚えておく必要があります。
ただし、常にではありません。バッファプールにあるデータに対して複雑なクエリを実行すると、I/OよりもCPUの制約を受ける可能性があります。したがって、データがRAMにどの程度収まるか、実行するクエリの種類、1秒あたりのクエリ数、ハードウェアの仕様など、多くの要因によって異なります。他の誰かがあなたのサーバー上のあなたのアプリケーションに答えることができるにはあまりにも多くの要因。あなたはそれをテストする必要があります。
あなたのコメントを再:
1つの可能性は、インデックスがバッファプールに適合していないことです。インデックス検索ですべてのSELECTクエリ中にページをロードしてページを削除する必要がある場合、パフォーマンスが大幅に低下します。 EXPLAIN分析では、インデックスがバッファプールに収まるかどうかはわかりません。
インデックス内の列の数や列のデータ型はわかりませんが、長いvarchar列にインデックスを付ける場合は、プレフィックスインデックスの使用(または列の長さの短縮)を検討する必要があります。
さらにRAMを取得し、バッファプールのサイズを増やすこともできます。
COMPRESSEDはデータを圧縮します。テキストは本当にうまく圧縮されます。私はいくつかのテーブルを持っていて、以前はDYNAMICを使用していましたが、COMPRESSEDに移動しました。
MySQL 5.7を使用しています
テーブル:
DYNAMICと比較してCOMPRESSEDで使用するスペースが80%少なくなります。前:80Gb、後:16Gb大幅な節約ですが、そのデータはそれほど必要ありません。
他のテーブルはそれほど劇的ではありませんでしたが、〜50%保存いくつかのテキストフィールドがあります。例えば。もう1つは6.4Gb-> 3.1Gbで、150万行です。
私は、ほとんどが整数/ビットなどを保存する圧縮された小さなテーブルに変更していません。これらのテーブルはすでにスペースが小さいため、CPUを追加で使用する必要はありません。