web-dev-qa-db-ja.com

mysqlはnull値をインデックス化しますか?

インデックス付きINT列が行の90%で0になるmysqlテーブルがあります。 0ではなくNULLを使用するようにこれらの行を変更すると、インデックスから除外され、インデックスが約90%小さくなりますか?

57
too much php

http://dev.mysql.com/doc/refman/5.0/en/is-null-optimization.html

MySQLは、col_name = constant_valueに使用できるのと同じ最適化をcol_name IS NULLで実行できます。たとえば、MySQLはインデックスと範囲を使用して、IS NULLでNULLを検索できます。

24
Chu Khanh Van

NULLsもインデックス付けするようです。

MySQLはインデックスの作成中にWRITESのテーブルをロックするため、これを実行するときは注意してください。列が空(すべてnull)であっても、大きなテーブルではインデックスの構築に時間がかかる場合があります。

参照

7
Bill the Lizard

列をNULLにすると、列のストレージ要件に1バイトが追加されます。これにより、インデックスサイズが増加しますが、これはおそらく適切ではありません。つまり、多くのクエリが「IS NULL」または「NOT NULL」を使用するように変更された場合、値の比較を行うよりも全体的に高速になる可能性があります。

私の腸はnullではないと教えてくれますが、1つの答えがあります:テスト!

2

いいえ、それらは引き続き含まれますが、どちらの場合でも結果がどうなるかについてあまり多くの仮定をしないでください。多くは他の値の範囲に依存します(「カーディナリティ」のグーグル)。

MSSQLには、このような状況に対応する「フィルターインデックス」と呼ばれる新しいインデックスタイプがあります(つまり、フィルターに基づいてインデックスにレコードを含めます)。以前はdBASEタイプのシステムにも同様の機能があり、非常に便利でした。

1
dkretz

各インデックスのカーディナリティは、インデックス付けされる個別の値の数を意味します。私の知る限り、インデックスが多くの行で同じ値を繰り返すと言うのは合理的な考えではありませんが、インデックスは繰り返し値を多くの行のクラスター化インデックス(このフィールドのnull値を持つ行)にのみアドレス指定し、クラスター化インデックスの参照IDを保持します意味:NULL値のインデックス付きフィールドを持つ各行は、PKと同じ大きさのサイズを浪費します(このため、複合PKがある場合、専門家は合理的なPKサイズを推奨します)。

1
Alix