MySQLデータベースインデックスの詳細な説明

MySQLデータベースインデックスの詳細な説明

本日も引き続き、MySQL関連の知識をご紹介させていただきます。今回の記事の主な内容はMySQLのインデックス関連の内容です。

1. MySQLインデックスの紹介

インデックスは、データクエリを高速化するために、MySQL データベースによってテーブル内の 1 つまたは複数の列に追加される「ディレクトリ」です。 MySQL のインデックスは特別なファイルですが、InnoDB タイプのエンジン (MySQL エンジンについては今後の記事で説明します) のテーブルのインデックスはテーブル スペースの不可欠な部分です。
MySQL データベースは、通常のインデックス、一意のインデックス、主キー インデックス、複合インデックス、全文インデックスの合計 5 種類のインデックスをサポートしています。以下では、これら 4 種類のインデックスを 1 つずつ紹介します。

2. MySQLの5種類のインデックスの詳しい説明

1. 総合索引

共通インデックスは、MySQL データベース内の共通のインデックスです。共通インデックスを追加する列のデータには特別な要件はありません。共通インデックスの役割は、差分クエリを高速化することです。
以下は、データ テーブルを作成するときに共通インデックス SQL ステートメントを追加する例です。

テーブルexp(id int, name varchar(20),index exp_name(name))を作成します。

または、次のようにインデックスをキーに置き換えます。

テーブル exp (id、int、name varahcr (20)、キー exp_name(name)) を作成します。

上記の SQL コマンドでは、key または index はインデックスの追加を意味し、その後にインデックス名が続き、括弧内の列はインデックスを追加する列です。
この記事で紹介したインデックス関連のSQL文では、特別な説明がない限り、インデックスをキーに置き換えることができます。記事の長さを節約するために、この点については今後繰り返しません。
また、インデックス名を指定せずにインデックスを追加することもできます。この場合、MySQL はフィールドと同じ名前のインデックス名を自動的にインデックスに追加します。
実行結果は次のとおりです。

ここに画像の説明を挿入

データ テーブルを作成した後、テーブルに新しい共通インデックス SQL ステートメントを追加する例を次に示します。

テーブル exp を変更し、インデックス exp_id(id) を追加します。

実行結果は次のとおりです。

ここに画像の説明を挿入

以下は、データ テーブルを作成した後に共通インデックスを削除する SQL ステートメントの例です。

テーブルを変更してインデックス exp_name を削除します。

実行結果は次のとおりです。

ここに画像の説明を挿入

上記のコマンドでは、exp_name はインデックスを含むフィールドの名前ではなく、インデックスの名前であることに注意してください。テーブル内のインデックスの名前を忘れた場合は、次の SQL コマンドを実行してクエリを実行できます。

exp からインデックスを表示します。

このうち、exp はテーブル名であり、コマンド実行結果は以下のようになります。

ここに画像の説明を挿入

上の図からわかるように、通常のインデックスを追加した後、desc を使用してテーブル構造を表示すると、Key 列に MUL が表示されます。これは、列に通常のインデックスが追加されたことを意味します。

(II) ユニークインデックス

ユニーク インデックスは、インデックスが追加された列のすべての値が 1 回だけ出現することを要求する共通インデックスです。通常、一意のインデックスは ID 番号や学生番号などのフィールドに追加されますが、名前などのフィールドに追加することはできません。
ユニーク インデックスの追加は、通常のインデックスの追加とほぼ同じですが、通常のインデックスのキーワード key と index が、ユニーク キーとユニーク インデックスに置き換えられます。
以下は、データ テーブルを作成するときに一意のインデックスを追加する SQL ステートメントの例です。

テーブル exp (id int、name varchar(20)、一意のキー (name)) を作成します。

上記コマンドの実行結果は以下のとおりです。

ここに画像の説明を挿入

desc コマンドを使用して、一意のインデックスが追加されたフィールドのテーブル構造を照会すると、キー列に UNI が表示され、フィールドに一意のインデックスが追加されたことが示されます。
データ テーブルを作成した後に一意のインデックスを追加する SQL ステートメントの例を次に示します。

ここに画像の説明を挿入

以下は、一意のインデックスを削除する SQL ステートメントの例です。

alter table exp drop index name;

実行結果は次のとおりです。

ここに画像の説明を挿入

(III) 主キーインデックス

主キー インデックスは、データベース内のすべてのインデックスの中で最もクエリ速度が速く、各データ テーブルには主キー インデックス列を 1 つだけ持つことができます。主キー インデックスの列には重複データや null 値を含めることはできません。
主キー インデックスの追加と削除は、キーが主キーに置き換えられることを除いて、通常のインデックスや一意のインデックスと非常によく似ています。関連する SQL コマンドは次のとおりです。

テーブル exp(id int 、name varchar(20)、主キー (id)) を作成します。テーブル exp を変更して主キー (id) を追加します。

列に主キー インデックスを追加すると、次に示すように、desc でテーブル構造を表示するときに、キー列に PRI が表示されます。

ここに画像の説明を挿入

主キー インデックスを削除するには、次のコマンドを実行します。

alter table exp 主キーを削除します。

この SQL ステートメントでは、キーをインデックスに置き換えることはできないことに注意してください。
時々、主キー インデックスを削除しようとすると、MySQL が拒否することがあります。これは、auto_increment 属性がフィールドに追加されていることが原因の可能性があります。次に示すように、フィールド修飾子を削除することで、フィールドの主キー インデックスを削除できます。

ここに画像の説明を挿入

(IV)総合指数

異なる列を含むインデックスを作成する場合は、複合インデックスを作成できます。実際、複合インデックスはビジネス シナリオで頻繁に使用されます。たとえば、データ パケットの内容を記録する場合、データ パケットを識別するための基準として IP とポート番号を使用する必要があります。この場合、IP アドレス列とポート番号列の複合インデックスを作成できます。以下は、複合インデックスの作成、追加、および削除を行う SQL ステートメントの例です。

テーブル exp (ip varchar(15),port int,主キー (ip,port)) を作成します。
alter table exp に主キー(ip、port)を追加します。
alter table exp dorp 主キー;

複合インデックスが作成された後、desc を使用してデータ テーブル構造を表示すると、キー列に複数の PRI が表示されます。これは、PRI を含むこれらの列が複合インデックスの列であることを意味します。以下のように表示されます。

ここに画像の説明を挿入

複合インデックスは、複数列の主キー インデックスと同等であることに注意してください。したがって、複合インデックスが追加される列には空のデータを含めることはできず、これらの列のデータは完全に同じにすることはできません。そうでない場合、MySQL データベースはエラーを報告します。以下のように表示されます。

ここに画像の説明を挿入

(V) 全文索引

全文インデックスは主に、大量のデータにおけるあいまい一致の問題を解決するために使用されます。データベース内のフィールドのデータ量が非常に多い場合、like+ワイルドカード方式を使用して検索すると、速度が非常に遅くなります。この場合、フルテキスト インデックスを使用してあいまいクエリを高速化できます。全文索引の原理は、単語分割技術によってテキスト内のキーワードとその出現頻度を分析し、順番に索引を作成することです。フルテキスト インデックスの使用は、データベースのバージョン、データ テーブル エンジン、さらにはフィールド タイプと密接に関連しています。主な制限は次のとおりです。
1. フルテキスト インデックスは、MySQL バージョン 3.2 以降でのみサポートされます。
2. MySQL バージョン 5.7 以降には ngram プラグインが組み込まれ、フルテキスト インデックスで中国語がサポートされるようになりました。
3. MySQL 5.6 より前のバージョンでは、MyISAM エンジンのみがフルテキスト インデックスをサポートしています。
4. MySQL 5.6 以降のバージョンでは、MyISAM エンジンと InnoDB エンジンの両方がフルテキスト インデックスをサポートしています。
5. フルテキスト インデックスの追加をサポートするのは、char、varchar、text のデータ型を持つフィールドのみです。
フルテキスト インデックスを作成、追加、削除するための SQL コマンドは次のとおりです。

テーブル exp (id int、コンテンツ テキスト、filltext キー (コンテンツ)) を作成します。エンジン = MyISAM;
alter table exp フルテキスト インデックス (コンテンツ) を追加します。
テーブル exp を変更してインデックスの内容を削除します。

実行結果の一部は次のとおりです。

ここに画像の説明を挿入

全文インデックスを作成した後は、あいまい検索に like+wildcard メソッドを使用することはできません。全文インデックスの使用には、次に示すように独自の特定の構文があります。

select * from exp where match(content) against ('a');

match の後の括弧内のフィールドには全文インデックスが含まれ、against の後の括弧内のフィールドにはあいまい一致の対象となるコンテンツが含まれます。
さらに、フルテキスト インデックスの役割は一意ではありません。多くのシナリオでは、MySQL データベースの組み込みフルテキスト インデックスを使用せず、同様のサードパーティ インデックスを使用して同じ機能を実現します。

3. MySQLインデックスの使用原則

1. インデックス作成は、典型的な「スペースと時間を交換する」戦略です。コンピュータのストレージ スペースを消費しますが、クエリの速度は上がります。
2. インデックスを追加するとクエリ速度は向上しますが、挿入と削除の速度は低下します。データの挿入および削除時に追加のインデックス操作が必要になるためです。
3. インデックスは多ければ多いほど良いです。データ量が多くない場合はインデックスを追加する必要はありません。
4. テーブルの値を頻繁に挿入および変更する必要がある場合、インデックスを作成することは適していません。逆に、テーブル内のフィールドの値を頻繁にクエリ、並べ替え、グループ化する必要がある場合は、インデックスを作成する必要があります。
5. フィールドがユニークインデックスを作成するための条件を満たしている場合は、通常のインデックスを作成しないでください。

要約する

これで、MySQL データベース インデックスの詳細な説明に関するこの記事は終了です。MySQL インデックスに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQLでテーブルインデックスを構築する方法
  • MySQL のインデックスとデータ テーブルを管理する方法
  • MySQLデータベースインデックスの詳細な紹介
  • MySQL データの最適化 - 多層インデックス
  • MySQLインデックスの基礎となるデータ構造の詳細
  • MySQL データベースのインデックスとトランザクション
  • MySQLテーブルのインデックス作成の原理の詳細な説明

<<:  Centos7 での NFS サービス構築の紹介

>>:  Vue+Echart 棒グラフで疫病データ統計を実現

推薦する

HTML ベース URL タグ

その機能はグローバル スタイルを設定することです。その後の相対パスはこれに基づきます: <im...

MySQL の日付型の単一行関数コードの詳細な説明

MySQL の日付型単一行関数: CURDATE()またはCURRENT_DATE()は現在の日付を...

CentOS IP接続ネットワーク実装プロセス図

1. システムにログインし、ディレクトリに入ります: cd /etc/sysconfig/netwo...

MySQLの日次統計レポートでは、その日にデータがない場合には0が入力されます。

1. 問題の再現:各日の合計数を日ごとにカウントします。データのない日がある場合、グループ化によっ...

IDEA に基づいて Tomcat サーバーを展開するための詳細な手順

目次導入ステップ1ステップ2: アイデアで動的Webプロジェクトを作成するステップ3: Tomcat...

WeChatアプレットは写真アップロード機能を実現

この記事の例では、WeChatアプレットで写真をアップロードするための具体的なコードを参考までに共有...

Node.js パッケージ マネージャー npm の具体的な使用方法

目次目的npm init および package.json ファイルモジュールのインストールと管理モ...

MySQL パーティション フィールド列に別のインデックスを作成する必要がありますか?

序文パーティション フィールドは主キーの一部でなければならないことは誰もが知っています。では、複合主...

魔法のMySQLデッドロックトラブルシューティング記録

背景MySQL のデッドロックについて言えば、私は以前 MySQL のロックに関する基本的な紹介記事...

JavaScript における var、let、const の違いの詳細な説明

目次グローバル変数として可変ホイスト一時的なデッドゾーンブロックスコープ重複したステートメント宣言さ...

Dockerはクロスプラットフォーム機能を実現するためにnet5プログラムを導入

展開環境: ここでは docker コンテナ、Linux システム、VmWare 仮想マシンが使用さ...

JavaScriptコールバック関数の詳細な理解

目次序文クイックレビュー: JavaScript 関数関数とは何ですか?関数を宣言する関数の呼び出し...

Vue 折りたたみ表示の複数行テキスト コンポーネントの実装コード

折りたたみ表示の複数行テキストコンポーネント複数行のテキスト コンポーネントを折りたたんで表示し、展...

nginx で gzip 圧縮を実装してウェブサイトの速度を向上させる方法

目次gzip 圧縮を使用する理由は何ですか? nginxはgzipを実装するgzip処理nginx ...

MySQL ステートメントの概要

目次1. データベースの使用を選択2. 情報を表示する3. テーブルを作成する4. データを挿入する...