MySQLのINDEX、PRIMARY、UNIQUE、FULLTEXTの違いは?


609

MySQLテーブルを作成するときのPRIMARY、UNIQUE、INDEX、およびFULLTEXTの違いは何ですか?

それらをどのように使用しますか?


3
また、誰でも好奇心のためにSPATIALstackoverflow.com/questions/2256364/...
レオ

Pythonでのプライマリインデックスとセカンダリインデックスの比較については、この投稿をご覧ください。stackoverflow.com
questions / 59918440 /

回答:


674

違い

  • 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インデックスを使用するには、クエリでインデックスのすべての列を使用する必要があります。)


2
これは、クエリでMATCH()/ AGAINST()を使用しない場合、FULLTEXTインデックスは本質的に役に立たず、腰のくびれがあることを意味しますか?
user1397417 2014年

5
はい。また、MySQLのMyISAMデータベースでのみ使用され、InnoDBでは使用されません。他のデータベースサーバーには、異なる動作をする同等の機能がある場合があります。
thomasrutter 2014年

「NULL値を許可する列では使用しないでください」->これは「使用不可」にする必要があります。主キーは必ずNOT NULLです。show columns他の主キーが定義されていない場合、MySQLはNULL以外の一意キーが主キーであることを報告します。
ゴードンリノフ2014

1
ここでの理論的根拠は、NULLはそれ自体と等しくないと考えられているということです。Loliはこれを忘れません
Hos Mercury

2
@thomasrutter MySQLは、バージョン5.6からInnoDBでFULLTEXTをサポートしています
Marek

151

これらはすべて一種のインデックスです。

プライマリ:一意である必要があり、インデックスであり、(おそらく)物理インデックスであり、テーブルごとに1つだけです。

ユニーク:それが言うように。この値のタプルを持つ複数の行を含めることはできません。一意のキーは複数の列にまたがることができるため、これは必ずしもインデックス内の個々の列が一意であることを意味するのではなく、これらの列全体の値の各組み合わせが一意であることを意味します。

インデックス:プライマリまたは一意でない場合、テーブルに挿入された値を制約しませんが、より効率的に検索することができます。

fulltext:全文検索を可能にする、より特殊な形式の索引付け。(本質的に)指定された列の「単語」ごとに「インデックス」を作成すると考えてください。


32
プライマリは、MySQL(および他の多くのDB)で複合、つまりマルチキーにすることができます。それらは特別なインデックスです。Uniqueは実際にはインデックスではなく、制約です(妥当な時間内にインデックスを適用する必要があるため、インデックスを作成します)。
MBCook 2009

19

私はこれが十分にカバーされているように感じます、おそらく以下を除いて:

  • 単純なKEY/ INDEX(またはと呼ばれるSECONDARY INDEX)は、選択性が十分であればパフォーマンスを向上させます。これに関して、通常の推奨事項は、インデックスが適用される結果セット内のレコードの量が親テーブルのレコードの合計量の20%を超える場合、インデックスは無効になるということです。実際には、各アーキテクチャは異なりますが、アイデアは依然として正しいです。

  • セカンダリインデックス(これはmysqlに非常に固有です)は、主キーから完全に分離した異なるオブジェクトと見なすべきではありません。実際、両方を併用する必要があり、この情報がわかったら、mysql DBAに追加のツールを提供します。Mysqlでは、インデックスは主キーを埋め込みます。特に、そこに記述されているような暗黙的なカバリングインデックスを巧妙に構築する場合に、パフォーマンスが大幅に向上します。

  • データをにする必要があると思われるUNIQUE場合は、一意のインデックスを使用してください。これはオプションであると考えるかもしれません(たとえば、アプリケーションレベルで実行する)と通常のインデックスは機能しますが、実際には、Mysqlが各行が一意であることを保証し、付随的にパフォーマンス上の利点をもたらします。

  • Innodb(MySQL 5.6.4以降)およびMyisamエンジンでのみ使用できますFULLTEXT(またはと呼ばれますSEARCH INDEX)。

  • あなただけ使用することができるFULLTEXTCHARVARCHARおよび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を参照してください
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.