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

推薦する

DockerはCMDまたはENTRYPOINTコマンドを使用して複数のサービスを同時に起動します

要件: Celery は Django に導入されています。Django プロジェクトを開始するとき...

JSのアンカーリンクをクリックするとスムーズにスクロールし、自由にトップ位置に調整できます。

アンカーリンクをクリックするとスムーズにスクロールし、自由にトップ位置に調整できます。 1. アンカ...

MySQL サービスを起動できない問題の解決策を含む MySQL 5.7.17 インストール チュートリアル

.net 開発に関しては、Microsoft の SQL Server データベースに精通しており、...

JS でオブジェクト プロパティを簡単にトラバースするいくつかの方法

目次1. 自己列挙可能なプロパティ2. Object.values()はプロパティ値を返します3. ...

ページのレンダリング時間を短縮してページの実行速度を速めます

ブラウザでのページのレンダリング時間をできるだけ短縮するにはどうすればよいでしょうか? この記事は、...

VPS はオフライン ダウンロード サーバーを構築します (ネットワーク ディスクの時代以降)

モチベーション学習の必要性から、海外のサーバーメーカー(どこのメーカーかは言いません)のVPSサービ...

Centos7 に mysql 8.0.13 (rpm) をインストールする詳細なチュートリアル

yum か rpm か? yum によるインストール方法は非常に便利ですが、公式サイトから MySQ...

ウェブページの最も基本的なコード

◆お気に入りに追加例示するクリックすると、ブラウザのお気に入りメニューにウェブサイトが追加されます...

HTML における <meta> タグの使用に関する詳細な説明

私たちが作成する Web ページでは、より多くの人々に訪問してもらいたい場合、検索エンジンを使用して...

nginxの基礎を学ぶ

目次1. nginx とは何ですか? 2. nginx で何ができるのか? 2.1 フォワードプロキ...

グローバルトーストコンポーネントをカプセル化するVueの完全な例

目次序文1. vue-cliを使う1. Toastコンポーネントを定義する2. main.jsで設定...

MySQL SQL ステートメントが遅い場合の一般的な原因と解決策

1. インデックス不足または無効なインデックスによるクエリの遅延数千万件のデータを含むテーブルで、イ...

Linux 負荷分散 LVS の詳細な理解

目次1. LVS 負荷分散2. 負荷分散LVSの基本紹介3. LVSアーキテクチャ3.1 ロードバラ...

MySQL の一般的な日付比較および計算関数

MySql での時間比較の実装unix_timestamp() unix_timestamp 関数は...