ディスクスペースとインデックスパフォーマンスの観点から、ほとんど空の列を処理するための最良の方法を理解しようとしています。すべての空の場所にNULLと''(varchar / textの場合)と0(intの場合)を配置することに違いはありますか?
ありがとう。
VARCHAR
いいえ、NULL を使用しても、空のまたはINT
フィールドよりも少ないスペースを占有することはありません。実際には、より多くのスペースが必要になる場合があります。理由は次のとおりです。
AVARCHAR
は、サイズ + 値として格納されます。サイズに使用されるバイト数は、VARCHAR
. VARCHAR(255)
1 バイト、VARCHAR(65536)
2 バイトなどです。
そのため、空の文字列を格納しても、そのVARCHAR(255)
列は 1 バイトを占めます。次の表では、行ごとに少なくとも 1 バイトが必要です (さらに、ストレージ エンジンによってはその他のオーバーヘッドが発生する可能性があります)。
CREATE TABLE sample (
a VARCHAR(255) NOT NULL
);
値を保存するためNULL
に、MySQL は各行にビットマスクを使用します。1 バイトあたり最大 8 つの null 許容列を格納できます。したがって、次のようなテーブルがある場合:
CREATE TABLE sample (
a VARCHAR(255) NULL
);
行ごとに最低 2 バイトかかります。保存NULL
はビットを設定するだけで、使用するかどうかに関係なく、すでに予約されています。のサイズのバイトはVARCHAR
、列が に設定されている場合でも、各行に引き続き使用されNULL
ます。
簡単な答えは、多分 (それは問題ではありませんが)、null はより少ないディスク領域を占有するかもしれませんが、領域の節約はおそらくわずかです (ただし、わずかな節約でも加算されます)。
ディスク容量が非常に厳しく制限されていない限り、私はそれについて心配しません (ディスク容量はプログラマーの時間よりもはるかに安価です)。
また、null と 0 (または '') は意味的に異なるため、同じ意味で使用しないでください。理論的な (または非常に小さな) パフォーマンスの向上のためではありません。
詳細については、この質問を参照してください。
インデックス作成には大きな影響はないと思いますが、わずかに速度が向上する可能性があります。
詳細については、この質問を参照してください。
この質問は、特に MySQL と null のパフォーマンスを扱います。
場合によります。
固定幅のテーブル ( VARCHAR
、VARBINARY
、BLOB
またはなしTEXT
) を使用している場合、おそらく違いはありません。
可変幅のテーブルでは、NULL
はおそらく空の と同じくらいのスペースを消費しますVARCHAR
。
ほぼすべての値がNULL
あり、データが含まれているのはごくわずかである場合は、結合する別のテーブルを作成できます。
では、生年月日がわかる人のリストがあるとします。
だから代わりに
CREATE TABLE people (id INT UNSIGNED NOT NULL PRIMARY KEY AUTOINCREMENT, name VARCHAR(60) NOT NULL, birthday DATE)
あなたができる
CREATE TABLE people (id INT UNSIGNED NOT NULL PRIMARY KEY AUTOINCREMENT, name VARCHAR(60) NOT NULL)
CREATE TABLE birthdates (id INT UNSIGNED, birthday DATE NOT NULL)
LEFT JOIN を使用してデータをクエリします。
古い形式のテーブルにアクセスする必要があるアプリケーションがある場合は、ビューを定義できます。