MySQL における KEY、PRIMARY KEY、UNIQUE KEY、INDEX の違い

MySQL における KEY、PRIMARY KEY、UNIQUE KEY、INDEX の違い

タイトルで提起された問題は、段階的に分解して解決することができます。 MySQL では KEY と INDEX は同義です。そうすると、この質問は PRIMARY KEY、UNIQUE KEY、INDEX の違いに簡略化できます。これら 3 つは、まさにインデックスの区分です。主キー インデックス、一意のインデックス、通常のインデックス (INDEX) です。

INDEX を使用すると、データベースからのデータの読み取りが高速化されます。 INDEX は通常、JOIN、WHERE、および ORDER BY 句の列に追加されます。

インデックスを作成するときは、インデックスが SQL クエリ ステートメント (通常は WHERE 句の条件として) に適用されていることを確認する必要があります。 実際、インデックスは主キーとインデックス フィールドを格納し、エンティティ テーブルのレコードを指すテーブルでもあります。

インデックスにも欠点があります。インデックスによりクエリ速度は向上しますが、INSERT、UPDATE、DELETE などのテーブル更新は遅くなります。テーブルを更新する場合、MySQL はデータだけでなくインデックス ファイルも保存する必要があるためです。

MySQL における KEY と INDEX の違い

KEY は通常、INDEX の同義語です。列定義にキーワード属性 PRIMARY KEY が指定されている場合は、PRIMARY KEY を KEY のみとして指定することもできます。これは他のデータベース システムとの互換性のために行われます。 PRIMARY KEY は一意の KEY です。この場合、すべてのキーワード列は NOT NULL として定義する必要があります。列が明示的に NOT NULL として定義されていない場合、MySQL はそれらを暗黙的に定義する必要があります。

KEY、またはキー値は、主キー (PRIMARY KEY)、外部キー (Foreign KEY) などのリレーショナル モデル理論の一部であり、データの整合性チェックや一意性制約などに使用されます。 INDEX は実装レベルにあります。たとえば、テーブル内の任意の列にインデックスを作成できます。その後、インデックスが作成された列が SQL ステートメントの Where 条件にある場合、データをすばやく見つけて取得できます。 UNIQUE INDEX に関しては、それは単なる INDEX のタイプです。UNIQUE INDEX を作成すると、この列のデータは繰り返されないことを示します。MySQL は、UNIQUE INDEX タイプのインデックスに対してさらに特別な最適化を行うことができると思います。

したがって、テーブルを設計するときには、KEY はモデル レベルのみでよく、クエリの最適化が必要な場合は、関連する列に対してインデックスを作成できます。

KEY はデータベースの物理構造であり、2 つの意味があります。1 つは制約であり、データベースの構造的整合性を制約および規制することに重点が置かれています。もう 1 つはインデックスであり、クエリを支援します。
•主キーには 2 つの機能があります。1 つは制約で、ストレージの主キーと一意性を制御するために使用されますが、このキーにインデックスも作成します。
• ユニークキーにも 2 つの機能があります。1 つはデータの一意性を規制する制約ですが、このキーにインデックスも作成します。
•外部キーにも 2 つの機能があります。1 つは制約機能で、データの参照整合性を規制しますが、同時にこのキーにインデックスも確立されます。

キーには制約とインデックスの両方の意味があることがわかります。

索引

INDEX もデータベースの物理構造ですが、補助クエリとしてのみ機能し、作成されると追加のスペースを占有します。インデックスはプレフィックスインデックス、フルテキストインデックスなどに分けられます。インデックスは単なるインデックスであり、インデックス付きフィールドの動作を制限するものではありません。

主キーと一意キーの違い

PRIMARY KEY と UNIQUE KEY は似ています。PRIMARY KEY は通常 1 つの列ですが、複数の列になることもあり、通常はデータの行を決定します。 テーブルには PRIMARY KEY を 1 つだけ設定できますが、UNIQUE KEY は複数設定できます。 列が UNIQUE KEY として設定されている場合、その列内の 2 つの行に同じデータが含まれることはありません。 PRIMARY KEY では NULL 値は許可されませんが、UNIQUE KEY では許可されます。

`ALTER TABLE table_name ADD PRIMARY KEY(column_name, …)

要約すると、類似点は次のとおりです。
• PRIMARY KEYとUNIQUE KEYは、列内のデータがオリジナルであることを確認するために使用されます。
• 1つ以上の列を追加できます

違い:
• テーブルには主キーは1つしか持てませんが、一意キーは複数持つことができます。

PRIMARY KEY には null 値を指定できませんが、UNIQUE KEY には null 値を指定できます。 PRIMARY KEY の 1 つ以上の列が NULL の場合、PRIMARY KEY が追加されると、列は自動的に NOT NULL に変更されます。 UNIQUE KEY は列に対する要件がなく、インデックスを参照して実装されます。挿入された値がすべて NULL の場合、インデックスの原則に従って、すべての NULL 値はインデックスに記録されません。したがって、すべて NULL 値を挿入する場合、重複が発生する可能性がありますが、他の重複値は挿入できません。

テーブル t を変更して制約 uk_t_1 UNIQUE (a,b); t に (a ,b ) 値 (null,1); # 繰り返すことはできません t に (a ,b ) 値 (null,null); # 繰り返すことができます

MySQL では、PRIMARY KEY 列に対して UNIQUE INDEX が自動的に作成されるため、再度インデックスを作成する必要はありません。

PRIMARY KEY と UNIQUE INDEX に関するインターネット上の説明:

「PRIMARY」は INDEX ではなく PRIMARY KEY と呼ばれることに注意してください。
KEY は論理レベルのものであり、テーブルとデータベースの設計を記述します (つまり、参照整合性を強化します)。
INDEX は物理レベルのものであり、テーブル操作のアクセス時間の改善に役立ちます。
すべての PK の背後には、(通常)一意のインデックスが(自動的に)作成されます。

オペレーションインデックス

インデックスを構築すると、インデックス ファイル用のディスク領域が消費されます。
mytable(username(length))にインデックスIndexNameを作成します。

CHAR または VARCHAR 型の場合、長さはフィールドの実際の長さより短くてもかまいません。BLOB または TEXT 型の場合は、長さを指定する必要があります。

テーブルを作成するときにインデックスを作成します。

テーブルmytableを作成します( 
 ID INT NULLではありません、  
 ユーザー名 VARCHAR(15) NOT NULL、
 INDEX [INDEXName] (ユーザー名(長さ)) 
);

インデックスの削除


DROP INDEX [INDEXName] ON mytable;

以下もご興味があるかもしれません:
  • Spring の Qualifier アノテーションの使用例
  • PHPプライマリスクリプトが不明な場合の解決策の概要
  • MySQL で複数の主キーが定義されているエラーの解決方法
  • SQLSERVER のクラスター化インデックスと主キーに関する誤解
  • mysql #1062 –キー ''PRIMARY'' の重複エントリ ''1''
  • MySQL でインデックスを作成すると主キーを作成できますか?
  • Spring @Primary および @Qualifier アノテーションの原則分析

<<:  Centos7でポートを開く方法

>>:  React refの使用例

推薦する

element.style インライン スタイルを変更する方法のチュートリアル

序文上記の Web ページ スタイルを記述しているときに、スタイルの値をどのように変更しても、ページ...

さまざまなSQL結合を簡単に学ぶ

SQL JOIN 句は、テーブル間の共通フィールドに基づいて 2 つ以上のテーブルの行を結合するため...

Linux システムコマンドのメモ

この記事では、Linux システム コマンドについて説明します。ご参考までに、詳細は以下の通りです。...

CSS 線形グラデーション凹型長方形遷移効果の実装

この記事では、線形グラデーションの凹四角形の遷移効果の難しさやアイデアについて説明します。主に、凹四...

自動ウェブページ更新と自動ジャンプのサンプルコード

ウェブページの自動更新: <head></head> の間に次のコードを追加...

HTML img タグの alt 属性と title 属性の使い方の紹介

ブラウザベンダーが標準を曲げて、ルールに従わないことをすると、問題や少なくとも混乱が生じる可能性があ...

Apache Superset を使用して ClickHouse データを視覚化する 2 つの方法

Apache Superset は、データを表示および探索する方法を提供する強力な BI ツールで...

Windows Server 2008 R2 マルチユーザー リモート デスクトップ接続ライセンス

仕事ではリモート サーバーが必要になることが多く、次の 2 つの問題に遭遇することがよくあります。 ...

非常に優れた CSS スキル 10 選のコレクションと共有

ここでは、CSS テクニックを巧みに使用することで、HTML を変更せずにブログやテンプレートの外観...

Dockerfile における ENTRYPOINT と CMD の違い

Docker システムの学習チュートリアルでは、Dockerfile を使用して Docker イメ...

美しい FLASH ウェブサイト デザイン例 50 選

Flashにより、デザイナーや開発者はブラウザ上でリッチなコンテンツを提供し、動き、インタラクティブ...

モバイル端末の適応により、px は自動的に rem に変換されます。

まずpostcss-pxtoremをインストールします: npm install postcss-p...

Dockerカスタムネットワークの詳細な紹介

目次Dockerカスタムネットワーク1. カスタムネットワークの紹介2. カスタムネットワークを作成...

すべてのホストがmysqlにアクセスできるようにする方法

1. MySQLデータベースのユーザーテーブルのレコードのHostフィールド値を%に変更します。奇妙...