InnoDBは、「ワイド」テーブルを別の方法で格納します。すべての列を1つの文字列にまとめる(さらに長さなどのオーバーヘッド)代わりに、次のことを行います。
- 特定の行のすべての列の合計が約8KBを超えると、データの一部が別の(「オフレコ」)ストレージ領域に移動されます。
- どの列をオフレコに移動するかは、列のサイズなどによって異なります。
- 詳細は
ROW_FORMAT
によって異なります 選ばれました。 - 「オフレコ」は別の16KBブロックです。
- 後で、
SELECT *
を実行するとき (または少なくともオフレコ列をフェッチする)、別のディスクフェッチを実行する必要があります。
どうすればいいですか?
- 列が非常に多いことを考え直してください。
- 「垂直分割」を検討してください。ここでは、選択した
TEXT
を含む別のテーブルがあります。 列。アプリのアクセスパターンに基づいて列のグループを選択することを提案します。 - 通常は非常に長い列の場合は、クライアントで列を圧縮して
BLOB
に保存することを検討してください。TEXT
の代わりに 。ほとんどの「テキスト」は3:1に縮小します。ブロブはテキストと同じようにオフレコで送信されますが、これらの圧縮されたブロブは小さいため、こぼれる可能性は低くなります。 - SQLでより多くの処理を実行します。すべての行を返さないようにするため、または全文を返さないようにするためなどです。クライアントに大量のテキストを盲目的に移動する場合、ネットワークとクライアントは経過時間の重要な要素になります。
SELECT
だけではありません 、それ自体。