web-dev-qa-db-ja.com

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

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

どうやって使うの?

566
Sam

違い

  • KEYまたはINDEXは、通常の一意でないインデックスを参照します。インデックスには異なる値を使用できます。そのため、インデックスmayには、インデックスのすべての列に同じ値を持つ行が含まれます。これらのインデックスはデータに制限を課さないため、特定のクエリを迅速に実行できるようにするためにのみ使用されます。

  • UNIQUEは、インデックスのすべての行がユニークでなければならないインデックスを指します。つまり、このインデックスのすべての列に対して、同じ行が別の行と同じNULL以外の値を持つことはできません。データベースシステムでは、データを挿入または更新するときにこの個別の値の規則を破ることができないため、クエリの高速化に使用されるだけでなく、UNIQUEインデックスを使用してデータを制限できます。

    データベースシステムでは、NULL値を許可する列にUNIQUEインデックスを適用できる場合があります。その場合、2つの行にNULL値が含まれる場合、2つの行が同一であることが許可されます(ここでの根拠は、NULLがそれ自体と等しくないことです)。ただし、アプリケーションによっては、mayこれが望ましくない場合があります。これを防ぐには、関連する列のNULL値を禁止する必要があります。

  • PRIMARY UNIQUEインデックスとまったく同じように動作しますが、常に 'PRIMARY'という名前が付けられ、テーブルには1つしか存在できない((should常に1ですが、一部のデータベースシステムではこれを強制していません)。 PRIMARYインデックスは、テーブル内の行を一意に識別するための主要な手段として意図されているため、UNIQUEとは異なり、NULL値を許可する列には使用しないでください。 PRIMARYインデックスは、行を一意に識別するのに十分な最小数の列に配置する必要があります。多くの場合、これは一意の自動インクリメントされた番号を含む1つの列にすぎませんが、国のリストの「countrycode」など、行を一意に識別できるものがあれば、代わりに使用できます。

    一部のデータベースシステム(MySQLのInnoDBなど)は、PRIMARYインデックスに現れる順序でテーブルのレコードをディスクに保存します。

  • FULLTEXTインデックスは上記のすべてとは異なり、その動作はデータベースシステム間で大きく異なります。 FULLTEXTインデックスは、上記の3つとは異なり、MATCH()/ AGAINST()句で実行される全文検索にのみ有用です-通常、bツリーを使用して内部的に実装されます(左端の列から選択、ソート、または範囲を許可)またはハッシュテーブル(左端の列から選択を許可)。

    他のインデックスタイプが汎用である場合、FULLTEXTインデックスは特殊な目的で使用されます。つまり、「フルテキスト検索」機能にのみ使用されます。

類似点

  • これらのインデックスにはすべて、複数の列が含まれている場合があります。

  • FULLTEXTを除き、列の順序は重要です。インデックスをクエリで使用するには、クエリは左から始まるインデックスの列を使用する必要があります-の2番目、3番目、または4番目の部分だけを使用することはできません静的な値と一致するためにインデックス内の前の列も使用している場合を除き、インデックス。 (FULLTEXTインデックスがクエリに役立つためには、クエリはインデックスのall列を使用する必要があります。)

638
thomasrutter

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

primary: は一意でなければならず、インデックスであり、(おそらく)物理インデックスであり、テーブルごとに1つだけ指定できます。

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

index: プライマリでもユニークでもない場合、テーブルに挿入された値を制限しませんが、より効率的に検索することができます。

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

144
tpdi

以下の点を除けば、これは十分にカバーされているようです。

  • 選択性が十分であれば、単純なKEY/INDEX(または別名SECONDARY INDEX)はパフォーマンスを向上させます。この点に関して、通常は、インデックスが適用される結果セット内のレコード数が親テーブルの総レコード数の20%を超えると、そのインデックスは無効になります。実際には各アーキテクチャーは異なりますが、考え方はまだ正しいです。

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

  • あなたのデータがUNIQUEでなければならないと思うなら、ユニークなインデックスを使ってください。あなたはそれがオプションであると考えるかもしれません(例えば、アプリケーションレベルでそれを解決する)そしてそれは通常のインデックスがするであろうが、実際には各行がユニークであるというMysqlのための保証を表します。

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

  • FULLTEXTCHAR、およびVARCHAR列型にのみTEXTを使用できます。
  • FULLTEXTインデックスは単にインデックスを作成するだけでなくLOTを含みます。たくさんのシステムテーブル、完全に独立したキャッシングシステム、そしていくつかの特別なルールと最適化が適用されています。 http://dev.mysql.com/doc/refman/5.7/ja/fulltext-restrictions.html および http://dev.mysql.com/doc/refman/5.7/を参照してください。 ja/innodb-fulltext-index.html
15
Sebas