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の使用例

推薦する

DockerにTensorFlow環境を素早くインストールする方法

Docker に TensorFlow 環境をすばやくインストールし、TensorFlow を使用し...

Docker ネットワークの原理とカスタム ネットワークの詳細な分析

Docker はホストマシン上のブリッジを仮想化します。コンテナを作成して起動すると、各コンテナには...

Alibaba Cloud Centos6.X でメールを送信する際に発生するさまざまな問題

序文: Webサービスを提供するために、Alibabaクラウドホストを新しくインストールしました。す...

Linux でファイアウォールがオフになっているかどうかを確認する方法

1. サービス方法ファイアウォールのステータスを確認します。 [root@centos6 ~]# サ...

MySQL テーブルがロックされているかどうかを照会する方法

具体的な方法: (推奨チュートリアル:MySQLデータベース学習チュートリアル)テーブルロックの状態...

アイデアのパッケージ化とクラウドサービスへのアップロードにおけるプロジェクトプロセスの分析

1つ。まず、アイデアとしてパッケージ化する必要があります。私はSpringbootフレームワークプロ...

位置のいくつかの巧妙な応用の詳細な説明:sticky スティッキーポジショニング

背景: position:sticky はスティッキー配置とも呼ばれます。スティッキー配置の要素は、...

純粋な CSS でフォ​​ーム検証を実装するためのサンプル コード

日常業務において、フォームの検証は非常に一般的な設計要件です。ログイン ボックスや登録ボックス、アン...

サーバーストレステストの概念と方法 (TPS/同時実行性)

目次1 ストレステストの指標1.1 秒あたり1.2 クォータ1.3 平均処理時間(RT) 1.4 同...

Linux でリモート サーバー ファイルの状態を表示する方法

以下のように表示されます。 test コマンドはファイルが存在するかどうかを判断します。 ssh u...

MySQLの保存時間の不一致の問題を解決する

Java を使用してシステム時間を取得し、それを MySQL データベースに保存した後、時間タイプが...

JSのバイナリファミリーについての簡単な説明

目次概要ブロブBlob の動作BLOB ダウンロード ファイルブロブ画像のローカル表示BLOB ファ...

MySQLの7種類のログの概要

MySQL には次のログ ファイルがあります。 1: 再実行ログ2: ロールバックログ(元に戻すログ...

CSSレイアウトにおけるフロート属性と位置属性の違い

CSS レイアウト - position プロパティposition 属性は、要素に適用する配置方法...

デザイナーの「職業病」について

デザイナーは世界で最も繊細で感情的な人々だと私はいつも感じています。私がこう言うときに優越感を感じる...