MySQL テーブルを作成するときの PRIMARY、UNIQUE、INDEX、FULLTEXT の違いは何ですか?
どのように使用すればいいでしょうか?
ベストアンサー1
違い
KEYまたはINDEX は、通常の非一意インデックスを指します。インデックスには異なる値が許可されているため、インデックスのすべての列に同じ値を持つ行が含まれる場合があります。これらのインデックスはデータに制約を課さないため、すべてのレコードをスキャンせずに特定の範囲のレコードにすばやくアクセスするためにのみ使用されます。
UNIQUE は、インデックスのすべての行が一意でなければならないインデックスを指します。つまり、行は、このインデックスのすべての列に対して、他の行と同じ NULL 以外の値を持つことはできません。UNIQUE インデックスは、特定のレコード範囲にすばやく到達するために使用されるだけでなく、データの挿入または更新時にデータベース システムによって個別値のルールが破られることが許可されないため、データに制約を強制するためにも使用できます。
データベース システムでは、NULL 値を許可する列に UNIQUE インデックスを適用できる場合があります。この場合、2 つの行の両方に NULL 値が含まれている場合は、それらの行が同一であることが許可されます (ここでの根拠は、NULL はそれ自体と等しくないと見なされることです)。ただし、アプリケーションによっては、これが望ましくない場合があります。これを防ぐには、関連する列で NULL 値を許可しないようにする必要があります。
PRIMARY は、UNIQUE インデックスとまったく同じように動作しますが、常に 'PRIMARY' という名前が付けられ、テーブルに 1 つしか存在できない点が異なります (常に 1 つ存在する必要がありますが、一部のデータベース システムではこれを強制しません)。PRIMARY インデックスは、テーブル内の任意の行を一意に識別するための主要な手段として意図されているため、UNIQUE とは異なり、NULL 値を許可する列には使用しないでください。PRIMARY インデックスは、行を一意に識別するのに十分な最小限の列に作成する必要があります。多くの場合、これは一意の自動増分番号を含む 1 つの列だけですが、国リストの "countrycode" など、行を一意に識別できる他のものがある場合は、代わりにそれを使用できます。
一部のデータベース システム (MySQL の InnoDB など) では、テーブルの実際のレコードが PRIMARY KEY の B ツリー インデックス内に内部的に格納されます。
FULLTEXTインデックスは上記のすべてとは異なり、その動作はデータベース システム間で大きく異なります。FULLTEXT インデックスは、MATCH() / AGAINST() 句で実行される全文検索にのみ役立ちます。上記の 3 つは通常、B ツリー (左端の列から選択、並べ替え、範囲指定が可能) またはハッシュ テーブル (左端の列から選択が可能) を使用して内部的に実装されます。
他のインデックス タイプは汎用的ですが、FULLTEXT インデックスは、目的が限定されており、「全文検索」機能にのみ使用されます。
類似点
これらのインデックスにはすべて、複数の列が含まれる場合があります。
FULLTEXT を除いて、列の順序は重要です。クエリでインデックスが役立つためには、クエリは左から始まるインデックスの列を使用する必要があります。静的な値と一致させるためにインデックス内の前の列も使用しない限り、インデックスの 2 番目、3 番目、または 4 番目の部分だけを使用することはできません。(FULLTEXT インデックスがクエリに役立つためには、クエリはインデックスのすべての列を使用する必要があります。)