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 棒グラフで疫病データ統計を実現

推薦する

Vue で円形プログレスバーを実装する例

データ表示は、常にあらゆる職業の人々が求めているものです。特にフロントエンド開発業界では、データを表...

WeChatアプレットが計算機機能を実装

この記事では、WeChatアプレットの計算機機能を実装するための具体的なコードを参考までに紹介します...

Docker に Kong ゲートウェイをインストールする方法の例

1. Dockerネットワークを作成する docker ネットワーク作成 kong-net 2. デ...

ウェブデザイン研究における XHTML の応用の概要

<br />一般的に、「標準的な Web ページ」のファイル構成は XHTML CSS ...

プレーンな JS オブジェクトの代わりに Map を使用する場合

目次1. マップは任意のタイプのキーを受け入れます2. マップにはキー名に関する制限はありません3....

アクティビティページでの CSS3 アニメーション効果の適用

背景あっという間に忙しい一年が終わり、毎年恒例のイベントの時期がやってきます。お祭り気分を演出するに...

Vueはel-tableを使用して列と行を動的に結合します

この記事の例では、el-tableを使用して列と行を動的にマージするVueの具体的なコードを参考まで...

JSコードコンパイラMonacoの使い方

序文私が必要としているのは、構文の強調表示、関数プロンプト、自動行折り返し、およびコードの折りたたみ...

HTML相対パスの親ディレクトリと子ディレクトリの書き方

親ディレクトリを指定する方法../ はソース ファイルの親ディレクトリを表し、../../ はソース...

全画面ページのスクロール効果を実現するJavaScript

JavaScript DOM を読み終えた後、解釈型 JavaScript スクリプト言語に対する...

MySQL クエリの最適化: クエリが遅い原因と解決策

開発に携わっている友人、特に MySQL に関係のある友人は、非常に遅い MySQL クエリに遭遇す...

Linux に ASPNET.Core3.0 ランタイムをインストールするためのサンプル コード

# 以下の例は x64 ビット ランタイム v3.0.0 用です mkdir /runtimes ...

Vue で axios を使用して画像をアップロードするときに発生する問題

目次FormDataとは何ですか? vueとaxiosの協力による実践的な体験追加()セット()消去...

MySQLクエリプランでken_lenの値を計算する方法

key_lenの意味MySQL では、次に示すように、explain を使用して SQL ステートメ...

安全な構成のためにDockerでTLSを有効にする手順

序文以前、Docker の 2375 Remote API を有効にしていました。会社のセキュリティ...