web-dev-qa-db-ja.com

主キーまたはインデックスをいつ使用する必要がありますか?

主キーまたはインデックスをいつ使用する必要がありますか?

それらの違いは何で、どれが最良ですか?

41
Sein Kraft

基本的に、主キーは(実装レベルで)特別な種類のインデックスです。具体的には:

  • テーブルには主キーを1つだけ含めることができます。例外はほとんどありませんが、すべてのテーブルに1つのキーが必要です。
  • 主キーは暗黙的にUNIQUEです。同じ主キーを持つ行を複数持つことはできません。その目的は行を一意に識別することだからです。
  • 主キーはNULLになることはないため、主キーを構成する行はNOT NULLでなければなりません

テーブルには複数のインデックスを含めることができ、インデックスは必ずしもUNIQUEとは限りません。インデックスには2つの理由があります。

  • 一意性制約を強制するには(これらはUNIQUE列を宣言するときに暗黙的に作成できます)
  • パフォーマンスを改善するため。 WHERE句の等価性または「より大きい/より小さい」の比較、およびJOINは、インデックスのある列ではるかに高速です。ただし、各インデックスは更新/挿入/削除のパフォーマンスを低下させるため、実際に必要な場所でのみ使用するようにしてください。
26

違い

テーブルに含めることができるのは1つの主キーですが、複数のインデックスです。

主キーは一意ですが、インデックスは一意である必要はありません。したがって、主キーの値はテーブル内のレコードを識別しますが、インデックスの値は必ずしもそうではありません。

通常、主キーには自動的にインデックスが付けられます。主キーを作成する場合、同じ列にインデックスを作成する必要はありません。

何を使用するか

各テーブルには主キーが必要です。各レコードを一意に識別することが保証されている主キーを定義します。

結合またはwhere条件で頻繁に使用する他の列がある場合、インデックスによりクエリが高速化される可能性があります。ただし、レコードを作成および削除する場合、インデックスにはオーバーヘッドがあります-大量の挿入および削除を行う場合は注意が必要です。

どちらがベストですか?

本当にありません-それぞれに目的があります。そして、実際にどちらかを選択できるわけではありません。

テーブルの主キーが何であるかを最初に自問し、定義することをお勧めします。

パーソナルエクスペリエンスでインデックスを追加するか、パフォーマンスが低下している場合。 Measure違い。SQLServerを使用する場合は、実行計画の読み方を学びます。

11
marapet

キーとインデックスは、異なることを実現するまったく異なる概念です。キーは、タプルが一意である必要がある論理的な制約です。インデックスはデータベースのパフォーマンス最適化機能であるため、データベースの論理的な機能ではなく物理的な機能です。

多くの場合、制約とインデックスの指定に類似または同一の構文が使用されるため、この2つの違いはあいまいになります。多くのDBMSは、キー制約が作成されるときにデフォルトでインデックスを作成します。論理的懸念と物理的懸念を分離することはデータ管理の非常に重要な側面であるため、キーとインデックスが混同される可能性は残念です。

「プライマリ」キーに関して。これらは「特別な」タイプのキーではありません。主キーは、テーブルの任意の1つの候補キーです。ほとんどのSQL DBMSで候補キーを作成するには、少なくとも2つの方法があり、PRIMARY KEY制約を使用するか、NOT NULL列でUNIQUE制約を使用します。すべてのSQLテーブルにPRIMARY KEY制約があることは非常に広く観察されている規則です。 PRIMARY KEY制約を使用することは従来の知恵であり、完全に合理的なことですが、ほとんどのDBMSはすべてのキーを等しいものとして扱うため、一般的には実用的または論理的な違いはありません。確かに、すべてのテーブルは少なくとも1つの候補キーを実施する必要がありますが、それらのキーがPRIMARY KEY制約またはUNIQUE制約のいずれによって実施されるかは通常重要ではありません。原則として、重要なのは候補キーであり、「プライマリ」キーではありません。

6
nvogel

これが役立つ場合があります 基本に戻る:主キーと一意のインデックスの違い

2つの違いは次のとおりです。

  1. 定義上、テーブル内のレコードを一意に識別するのに役立つため、プライマリキーはNULLにできないため、テーブルのプライマリキーを作成する列はNULLにできません。一意のインデックスを構成する列はNULL可能です。ここで言及する価値がある注意点は、異なるRDBMSがこれを異なる方法で処理することです。これは、RDBMS全体でアプリケーションを設計/開発/移植するときに注意すべきことの1つです。
  2. テーブルには主キーを1つだけ定義できますが、テーブルには多くの一意のインデックスを定義できます(必要な場合)。
  3. また、SQL Serverの場合、デフォルトオプションを使用すると、主キーはクラスター化インデックスとして作成され、一意のインデックス(制約)は非クラスター化インデックスとして作成されます。ただし、これは単なるデフォルトの動作であり、必要に応じて作成時に変更できます。
6
alejandrobog

主キーは、定義により一意です。これは、各行を識別します。行を識別する唯一の方法であるため、テーブルには常に主キーが必要です。

インデックスは、基本的にフィールドまたはフィールドセットの辞書です。あるフィールドが特定の値に等しいレコードを見つけるようデータベースに要求すると、辞書(インデックス)を調べて適切な行を見つけることができます。これは非常に高速です。これは、辞書と同様に、エントリがインデックスでソートされるため、バイナリ検索が可能になるためです。インデックスがない場合、データベースはテーブルの各行を読み取って値を確認する必要があります。

通常、フィルタリングする必要がある各列にインデックスを追加します。特定の列の組み合わせで検索する場合、それらの列すべてを含む単一のインデックスを作成できます。その場合、同じインデックスを使用して、インデックス内の列のリストのプレフィックスを検索できます。簡単に言えば(少し不正確な場合)、ディクショナリは列で使用される値の連結で構成されるエントリを指定された順序で保持するため、データベースは特定の値で始まるエントリを検索し、効率的なバイナリ検索を使用しますこの。

たとえば、列(A、B、C)にインデックスがある場合、Aのみをフィルター処理しても、インデックスの最初の列であるため、このインデックスを使用できます。同様に、AとBの両方をフィルタリングする場合に使用できます。ただし、BまたはCのみをフィルタリングする場合は使用できません。これらは列のリストのプレフィックスではないためです。 。

主キーはインデックスとしても機能するため、主キーと同じ列を変換するインデックスを追加する必要はありません。

4
Michael Madsen