UNIQUEとPRIMARYKEYは制約です 、インデックスではありません。ほとんどのデータベースは、インデックスを使用してこれらの制約を実装していますが。インデックスに加えて制約の追加のオーバーヘッドは重要ではありません。特に、意図しない重複が発生した場合(発生した場合ではない場合)に追跡して修正するコストをカウントする場合は重要です。
インデックスは通常、選択性が高い場合に効果的です。 。これは、行の総数に対する個別の値の数の比率です。
たとえば、社会保障番号の列に、100万の異なる値を持つ100万の行があるとします。したがって、選択性は1000000/1000000 =1.0です(まれな歴史的な例外はありますが、SSNは一意であることが意図されています)。
ただし、そのテーブルの別の列である「gender」には、100万行を超える2つの異なる値しかない場合があります。 2/1000000=非常に低い選択性。
UNIQUEまたはPRIMARYKEY制約のあるインデックスは、1.0の選択性を持つことが保証されているため、インデックスが可能な限り効果的です。
主キーと一意性制約の違いについて質問されました。主に、テーブルごとに1つの主キー制約のみを持つことができます(その制約の定義に複数の列が含まれている場合でも)が、複数の一意の制約を持つことができます。一意性制約のある列はNULLを許可できますが、主キー制約の列はNULLを許可してはなりません。それ以外の点では、主キーと一意のキーの実装と使用法は非常に似ています。
MyISAMとInnoDBのどちらを使用するかについてコメントで質問されました。 MySQLでは、ストレージエンジンという用語を使用します 。これら2つのストレージエンジンの間には微妙な違いがたくさんありますが、主なものは次のとおりです。
- InnoDBはトランザクションをサポートしているため、変更をロールバックするかコミットするかを選択できます。 MyISAMは事実上常に自動コミットされます。
- InnoDBは外部キー制約を適用します。 MyISAMは、外部キー制約を強制したり、保存したりしません。
これらの機能がアプリケーションに必要なものである場合は、InnoDBを使用する必要があります。
あなたのコメントに答えるのは、それほど単純ではありません。 InnoDBは、実際にはMyISAMよりも高速である場合が非常に多いため、アプリケーションの選択、更新、同時クエリ、インデックス、バッファー構成などの組み合わせによって異なります。
http:/を参照してください。 /www.mysqlperformanceblog.com/2007/01/08/innodb-vs-myisam-vs-falcon-benchmarks-part-1/ ストレージエンジンの非常に徹底的なパフォーマンス比較のために。 InnoDBはMyISAMに頻繁に勝つため、一方が他方よりも速いとは明らかに不可能です。
ほとんどのパフォーマンス関連の質問と同様に、アプリケーションで答える唯一の方法 アプリケーションと代表的なデータサンプルを使用して両方の構成をテストし、結果を測定することです。