MySQLの一意の制約
-
10-07-2019 - |
質問
一意制約はデフォルトでインデックスですか?そうでない場合、一意の制約を SELECT ... WHERE
句で使用すると、インデックス付き列と同じパフォーマンス結果が得られますか?
ありがとう
解決
一意の制約は、必ずインデックスです。通常は、「UNIQUE INDEX」として定義します。一意の制約を効率的に実装するには、いずれの場合もインデックスが必要になるため、インデックスを使用しても不利ではありません。
他のヒント
実際には、制約はインデックスとは非常に異なります。MySQLは一意性を強制するようになっているというだけです。ただし、インデックスは(一意の場合もありますが)ハードディスクの物理的な順序、または列の効率的な検索を可能にする追加の構造(通常はツリー)に関するものです。
ただし、これをすべて(通常はクラスター化された)一意のインデックスを定義する主キーと混同している可能性があります。
一意制約は、何か(属性値の組み合わせなど)がリレーション全体(" table")のスコープ内で一意でなければならないという事実を表現する方法です。
これは、論理設計のレベルです。
インデックスは、このような制約を実施するのに役立つ可能性のある手段です。
これは物理設計のレベルです。
一部のDBMS製品は、UNIQUE制約などの特定の論理設計構造の存在から、何らかのインデックスの存在など、特定の物理設計構造を推測する場合があります。他の人はそうではないかもしれません。
UNIQUEは実際にはインデックスの制約です 。そのため、UNIQUEは一意性を適用するフィールドにインデックスがあることを意味します。
一意制約の使用を開始する前に、主キー制約を確認してください。
主キー制約は、一意制約と非NULL制約の宣言に相当します。主キーに複数の列がある場合、各列は非NULL制約を取得しますが、一意制約は一緒に取得されるすべての列に適用されます。
主キーを宣言すると、DBMSがインデックスを作成します。必要に応じてインデックスを削除できますが、DBMSがテーブルスキャンを実行して一意性をチェックすると、ひどいパフォーマンスが得られます。
主キー制約はエンティティの整合性を強制し、参照(外部キー)制約は参照整合性を強制します。これらを組み合わせることで、データの整合性を確保するのに役立ちます。