MySQLテーブルを作成するときのPRIMARY、UNIQUE、INDEX、およびFULLTEXTの違いは何ですか?
それらをどのように使用しますか?
MySQLテーブルを作成するときのPRIMARY、UNIQUE、INDEX、およびFULLTEXTの違いは何ですか?
それらをどのように使用しますか?
回答:
KEYまたはINDEXは、通常の一意でないインデックスを参照します。インデックスには個別の値を使用できるため、インデックスのすべての列に同じ値の行が含まれる場合があります。これらのインデックスはデータに制約を課さないため、アクセスのみに使用されます。つまり、すべてのレコードをスキャンせずに特定の範囲のレコードにすばやく到達するためです。
UNIQUEは、インデックスのすべての行が一意である必要があるインデックスを参照します。つまり、同じ行は、このインデックスのすべての列に対して別の行と同じ非NULL値を持たない場合があります。UNIQUEインデックスは、特定のレコード範囲にすばやく到達するために使用されるだけでなく、データベースシステムがデータの挿入または更新時に個別値ルールを破ることを許可しないため、データを制限するために使用できます。
データベースシステムでは、NULL値を許可する列にUNIQUEインデックスを適用できる場合があります。その場合、2つの行にNULL値が含まれていれば、2つの行を同一にすることができます(ここでの根拠は、NULLはそれ自体と等しくないと見なされているためです)。ただし、アプリケーションによっては、これが望ましくない場合があります。これを防止する場合は、関連する列でNULL値を許可しないようにする必要があります。
PRIMARYはUNIQUEインデックスとまったく同じように機能しますが、名前は常に「PRIMARY」であり、テーブルに存在できるのは1つだけです(ただし、常に存在する必要があります。ただし、データベースシステムによってはこれが強制されません)。PRIMARYインデックスは、テーブル内の行を一意に識別する主要な手段として意図されているため、UNIQUEとは異なり、NULL値を許可する列では使用しないでください。PRIMARYインデックスは、行を一意に識別するのに十分な最小数の列にある必要があります。多くの場合、これは一意の自動インクリメント番号を含む1つの列ですが、国のリストにある「countrycode」など、行を一意に識別できるものがある場合は、代わりにそれを使用できます。
一部のデータベースシステム(MySQLのInnoDBなど)は、テーブルのレコードを、PRIMARYインデックスに表示される順序でディスクに格納します。
FULLTEXTインデックスは上記のすべてのものとは異なり、その動作はデータベースシステム間で大幅に異なります。FULLTEXTインデックスは、上記の3つとは異なり、MATCH()/ AGAINST()句を使用して実行される全文検索にのみ役立ちます。これらは通常、Bツリーを使用して内部的に実装されます(左端の列から選択、並べ替え、または範囲を開始できます)またはハッシュテーブル(左端の列から選択できる)。
他のインデックスタイプが汎用である場合、FULLTEXTインデックスは狭い目的で使用されるという点で特殊化されています。「全文検索」機能でのみ使用されます。
これらのすべてのインデックスには、複数の列が含まれる場合があります。
FULLTEXTを除いて、列の順序は重要です。クエリでインデックスを有効にするには、クエリは左から始まるインデックスの列を使用する必要があります。クエリの2番目、3番目、4番目の部分だけを使用することはできません。静的な値に一致させるためにインデックスの前の列も使用している場合を除き、インデックス。(クエリでFULLTEXTインデックスを使用するには、クエリでインデックスのすべての列を使用する必要があります。)
NOT NULL
です。show columns
他の主キーが定義されていない場合、MySQLはNULL以外の一意キーが主キーであることを報告します。
これらはすべて一種のインデックスです。
プライマリ:一意である必要があり、インデックスであり、(おそらく)物理インデックスであり、テーブルごとに1つだけです。
ユニーク:それが言うように。この値のタプルを持つ複数の行を含めることはできません。一意のキーは複数の列にまたがることができるため、これは必ずしもインデックス内の個々の列が一意であることを意味するのではなく、これらの列全体の値の各組み合わせが一意であることを意味します。
インデックス:プライマリまたは一意でない場合、テーブルに挿入された値を制約しませんが、より効率的に検索することができます。
fulltext:全文検索を可能にする、より特殊な形式の索引付け。(本質的に)指定された列の「単語」ごとに「インデックス」を作成すると考えてください。
私はこれが十分にカバーされているように感じます、おそらく以下を除いて:
単純なKEY
/ INDEX
(またはと呼ばれるSECONDARY INDEX
)は、選択性が十分であればパフォーマンスを向上させます。これに関して、通常の推奨事項は、インデックスが適用される結果セット内のレコードの量が親テーブルのレコードの合計量の20%を超える場合、インデックスは無効になるということです。実際には、各アーキテクチャは異なりますが、アイデアは依然として正しいです。
セカンダリインデックス(これはmysqlに非常に固有です)は、主キーから完全に分離した異なるオブジェクトと見なすべきではありません。実際、両方を併用する必要があり、この情報がわかったら、mysql DBAに追加のツールを提供します。Mysqlでは、インデックスは主キーを埋め込みます。特に、そこに記述されているような暗黙的なカバリングインデックスを巧妙に構築する場合に、パフォーマンスが大幅に向上します。
データをにする必要があると思われるUNIQUE
場合は、一意のインデックスを使用してください。これはオプションであると考えるかもしれません(たとえば、アプリケーションレベルで実行する)と通常のインデックスは機能しますが、実際には、Mysqlが各行が一意であることを保証し、付随的にパフォーマンス上の利点をもたらします。
Innodb(MySQL 5.6.4以降)およびMyisamエンジンでのみ使用できますFULLTEXT
(またはと呼ばれますSEARCH INDEX
)。
FULLTEXT
上CHAR
、VARCHAR
およびTEXT
列の型FULLTEXT
インデックスには、単にインデックスを作成する以上の多くのことが含まれます。多数のシステムテーブルが作成され、完全に独立したキャッシュシステムがあり、いくつかの特定のルールと最適化が適用されています。http://dev.mysql.com/doc/refman/5.7/en/fulltext-restrictions.htmlおよびhttp://dev.mysql.com/doc/refman/5.7/en/innodb-fulltext-index.htmlを参照してください
SPATIAL
:stackoverflow.com/questions/2256364/...