1. ホーム
  2. sql

[解決済み] MySQLのNULL (パフォーマンスとストレージ)

2023-07-02 09:30:15

質問

MySQL において null はパフォーマンスおよびストレージ(スペース)上、具体的に何をするのですか?

例えば

TINYINT: 1バイト TINYINT w/NULL 1バイト + なぜかNULLが格納される?

どのように解決するのですか?

使用するストレージエンジンに依存します。

MyISAMフォーマットでは、各行ヘッダはNULL状態をエンコードするために、各カラムに1ビットを持つビットフィールドを含んでいます。 NULLであるカラムはまだスペースを取るので、NULLがストレージを減らすことはありません。 参照 https://dev.mysql.com/doc/internals/en/myisam-introduction.html

InnoDBでは、各列には行ヘッダ内に"フィールド開始オフセット"があり、これは列ごとに1バイトか2バイトです。 フィールド開始オフセットの上位ビットは、列がNULLの場合にオンとなります。 この場合、そのカラムを保存する必要は全くありません。 したがって、多くのNULLがある場合、ストレージは大幅に削減されるはずです。 参照 https://dev.mysql.com/doc/internals/en/innodb-field-contents.html

EDITです。

NULLビットは行ヘッダの一部であり、追加することを選択するものではありません。

NULL がパフォーマンスを向上させると私が想像できる唯一の方法は、InnoDB において、行が NULL を含む場合、データのページがより多くの行に適合する可能性があるということです。 そのため、InnoDB バッファはより効果的である可能性があります。

しかし、これが実際に大きなパフォーマンス上の利点を提供するのであれば、私は非常に驚きます。 NULL がパフォーマンスに与える影響について心配することは、マイクロ最適化の領域です。 他の分野、つまり、より大きな利益をもたらす分野に注意を向けるべきでしょう。 例えば、適切に選択されたインデックスの追加や、データベースキャッシュの割り当ての増加などです。