ホームページ >データベース >mysql チュートリアル >MySQL ストレージ エンジンのインデックスの簡単な分析

MySQL ストレージ エンジンのインデックスの簡単な分析

青灯夜游
青灯夜游転載
2021-10-29 19:23:421538ブラウズ

この記事では、MySQL ストレージ エンジンにインデックスを実装する方法について説明します。お役に立てば幸いです。

MySQL ストレージ エンジンのインデックスの簡単な分析

ストレージ エンジン ファイルが異なると、データ ファイル ディレクトリが異なることがわかります。データ ファイル ディレクトリを表示できます:

show VARIABLES LIKE 'datadir';

各 InnoDB テーブルには 2 つのファイル ( .frm および .ibd)、MyISAM テーブルには 3 つのファイル (.frm、.MYD、.MYI) があります。 [関連する推奨事項: mysql ビデオ チュートリアル ]

には同じファイル .frm があります。 .frm は MySQL のテーブル構造を定義するファイルで、テーブル作成時にどのストレージ エンジンを選択しても生成されるため、ここでは説明しません。

私たちは主に、他の 2 つのファイルがさまざまな MySQL ストレージ エンジンのインデックスをどのように実装するかを見ていきます。

まず MyISAM を見てみましょう。

MyISAM

MyISAM には、他に 2 つのファイルがあります。

1 つは .MYD ファイルです。D は を表します。 Data は、user_myisam テーブルのすべてのテーブル データなどのデータ レコードを保存する MyISAM のデータ ファイルです。

1 つは .MYI ファイルです。I は Index の略で、MyISAM のインデックス ファイルです。インデックスが格納されます。たとえば、id に主キー インデックスを作成するとします。フィールドにある場合、主キー インデックスはファイル内のこのインデックスにあります。

つまり、MyISAM では、インデックスとデータは 2 つの独立したファイルです。では、インデックスに基づいてデータを見つけるにはどうすればよいでしょうか?

MyISAM の B ツリーでは、リーフ ノードにデータ ファイルに対応するディスク アドレスが格納されます。したがって、インデックス ファイル .MYI からキー値を見つけた後、対応するデータ レコードがデータ ファイル .MYD から取得されます。

MySQL ストレージ エンジンのインデックスの簡単な分析

ここで描かれているのは主キーインデックスですが、補助インデックスの場合は何が違うのでしょうか?

MyISAM では、補助インデックスもこの .MYI ファイルにあります。補助インデックスと主キー インデックスでは、データの格納と取得の方法に違いはなく、インデックス ファイルでディスク アドレスを検索し、データ ファイルのデータを取得します。

MySQL ストレージ エンジンのインデックスの簡単な分析

InnoDB

InnoDB にはファイル (.ibd ファイル) が 1 つしかありません。では、インデックスはどこに配置されるのでしょうか?

InnoDB では、主キーをインデックスとして使用してデータ ストレージを整理するため、インデックス ファイルとデータ ファイルは同じファイルであり、両方とも .ibd ファイル内にあります。

InnoDB の主キー インデックスのリーフ ノードには、データが直接保存されます。

MySQL ストレージ エンジンのインデックスの簡単な分析

#クラスター化インデックス (クラスター化インデックス) とは何ですか?

は、インデックス キー値の論理順序が、テーブル データ行の物理的な格納順序と一致していることを意味します。 (たとえば、辞書ディレクトリはピンインでソートされ、コンテンツもピンインでソートされます。このピンインでソートされたディレクトリはクラスター化インデックスと呼ばれます)。

InnoDB では、データを編成する方法は (クラスター化インデックス編成テーブル) と呼ばれるため、主キー インデックスはクラスター化インデックス、非主キーは非クラスター化インデックスです。

名前フィールドに構築する通常のインデックスなど、主キー以外のインデックスはどのようにデータを保存および取得するのでしょうか?

MySQL ストレージ エンジンのインデックスの簡単な分析

InnoDB では、主キー インデックスと補助インデックスの間には主と副の区別があります。

補助インデックスには、補助インデックスと主キーの値が格納されます。補助インデックスを使用してクエリを実行すると、主キーの値に基づいて主キー インデックスがクエリされ、最終的にデータが取得されます。

たとえば、名前インデックスを使用して name= '青山' をクエリすると、リーフ ノードで主キー値、つまり id=1 が見つかり、次のリーフ ノードに移動します。データを取得するための主キーインデックス。

別の質問ですが、テーブルに主キーがない場合はどうなりますか?

1. 主キー (PRIMARY KEY) を定義すると、InnoDB は主キーをクラスター化インデックスとして選択します。

2. 主キーが明示的に定義されていない場合、InnoDB は NULL 値を含まない最初の一意のインデックスを主キー インデックスとして選択します。

3. そのような一意のインデックスがない場合、InnoDB は組み込みの 6 バイト長の ROWID を非表示のクラスター化インデックスとして選択し、行レコードが書き込まれるときに主キーをインクリメントします。

rreeee

それで?主キーのないテーブルは存在しません。

概要

上記の分析を通じて、MyISAM と InnoDB という 2 つの主要なストレージ エンジンにおけるインデックスの具体的な実装形式がどのようなものであるかがわかりました。

プログラミング関連の知識について詳しくは、プログラミング入門をご覧ください。 !

以上がMySQL ストレージ エンジンのインデックスの簡単な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。