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

推薦する

JS WebSocketを使用して簡単なチャットを実装する方法

目次ショートポーリングロングポーリングウェブソケットコミュニケーションの原則シンプルな1対1チャット...

MySQL 5.7.17 winx64 のインストールと設定方法のグラフィックチュートリアル

Windows インストール mysql-5.7.17-winx64.zip メソッド レコード &...

docker リモート API のワンクリック TLS 暗号化の実装

目次1. Docker の 2375 ポートを別のポートに変更します。これは一時的な対策にすぎません...

Windows Server 2008 R2 に MySQL 5.7.10 をインストールする手順

MSIインストールパッケージを使用してインストールするご使用のオペレーティング システムに応じて、対...

JavaScriptは文字の出現回数をカウントします

この記事の例では、文字の出現回数をカウントするJavaScriptの具体的なコードを参考までに共有し...

MySQL並列レプリケーションの簡単な説明

1. 並列レプリケーションの背景まず、並列レプリケーションの概念はなぜ存在するのでしょうか? 1. ...

VMware での Ubuntu 16.04 イメージの完全インストール チュートリアル

この記事では、VMware 12でのUbuntu 16.04イメージのインストールチュートリアルを参...

レンダリング関数と JSX の詳細

目次1. 基本2. ノード、ツリー、仮想DOM 1. 仮想DOM 3. createElementパ...

この構成ファイルの排他ロックに失敗したという VMware 仮想マシンのプロンプトの解決方法

VMware が異常シャットダウンした後、再起動すると「この構成ファイルを排他的にロックできませんで...

SQL グループ化により重複を削除し、他のフィールドで並べ替える

必要:あるフィールドの同一項目を結合し、別の時間フィールドで並べ替えます。例:初めに テーブルから都...

vue-routerフック関数はルーティングガードを実装します

目次概要グローバルフック関数ルーティング固有のフック関数コンポーネント内のフック関数概要ルートガード...

Linux での MySQL 8.0.25 のインストールと設定のチュートリアル

LinuxにMySQL 8.0.25をインストールするための最新のチュートリアルを参考にしてください...

表示または可視性によってHTML要素を非表示にする

場合によっては、特定の条件に基づいて Web ページ内の HTML 要素を表示するか非表示にするかを...

docker compose を使ってワンクリックで分散構成センター Apollo を展開するプロセスの詳細な説明

導入分散について話すときは、分散構成センター、分散ログ、分散リンク トラッキングなどについて考える必...

Windows ベースの MySQL 8.0.12 のインストール

このチュートリアルは Windows システムにのみ適用されます。インストールしたがまだインストール...