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

推薦する

キーフリーログインプロセスを実現するためのLinux構成の分析

1.sshコマンドLinux では、ssh コマンドを使用して別のサーバーにログインできます。 2 ...

MySQL を使用してポート 3306 を開いたり変更したり、Ubuntu/Linux 環境でアクセス許可を開く

オペレーティングシステム: Ubuntu 17.04 64ビットMySQL バージョン: MySQL...

Dockerイメージサイズを最適化する一般的な方法

通常、私たちが構築する Docker イメージはサイズが大きく、多くのディスク領域を占有します。コン...

Linux での crontab スケジュール実行コマンドの詳細な説明

LINUX では、定期的なタスクは通常、cron デーモン プロセス [ps -ef | grep ...

フロントエンドパフォーマンス最適化に関する補足記事

序文私は、Web サイトのフロントエンド パフォーマンス最適化のための JavaScript と C...

トリガーメソッドを使用して、ファイルタイプの入力をクリックせずにポップアップファイル選択ダイアログボックスを実現します。

トリガー メソッドを使用できます。JavaScript にはネイティブのトリガー関数はありません。自...

nginx のロケーションで URI の傍受を実装する方法

例:場所のルートとエイリアスルートディレクティブは、ルートによって設定されたディレクトリに検索ルート...

MySQL シリーズ 12 バックアップとリカバリ

目次チュートリアルシリーズ1. バックアップ戦略の説明1. バックアップの種類2. バックアップで考...

MySQL がタイムスタンプを使用するときにタイムゾーンの問題を無視できるのはなぜですか?

私はいつも、なぜMySQLデータベースのtimestampタイムゾーンの問題を無視できるのか疑問に思...

MySQL 5.7.21 のインストールと設定方法のグラフィックチュートリアル (ウィンドウ)

ウィンドウ環境にmysql5.7.21をインストールします。詳細は次のとおりです。 1. MySQL...

Vue2.0は適応解像度を実装する

この記事では、適応解像度を実現するためのVue2.0の具体的なコードを参考までに紹介します。具体的な...

Tomcat でのサーブレットの作成と実装に関する深い理解

1. サーブレットとは何か1.1. 正式な言葉で説明する:サーブレットは、動的な Web リソースを...

LeetCode の SQL 実装 (184. 部門内で最も高い給与)

[LeetCode] 184. 部門最高給与従業員テーブルにはすべての従業員が保存されます。すべて...

Linux nohup はプログラムをバックグラウンドで実行し、表示します (nohup と &)

1. バックグラウンド実行一般的に、Linux 上のプログラムは .sh ファイル (./sh フ...

vue N​​progress のプログレスバー機能を実装する際の一般的な問題

NProgress は、ページがジャンプしたときにブラウザの上部に表示される進行状況バーです。公式ウ...