ホームページ  >  記事  >  データベース  >  MySQLインデックスの実装原理

MySQLインデックスの実装原理

黄舟
黄舟オリジナル
2017-02-06 10:31:051539ブラウズ

Mysql インデックスの説明

MySQL では、インデックスはストレージ エンジン レベルの概念であり、ストレージ エンジンごとに異なる方法でインデックスが実装されます。この記事では主に、MyISAM と InnoDB の 2 つのストレージ エンジンのインデックス実装方法について説明します。

MyISAM インデックスの実装

MyISAM エンジンは、インデックス構造として B+Tree を使用します。リーフ ノードのデータ フィールドには、データ レコードのアドレスが格納されます。次の図は、MyISAM インデックスの概略図です。

MySQLインデックスの実装原理

テーブルに合計 3 つの列があると仮定し、主キーとして Col1 を使用すると仮定します。図 8 は主インデックス (主キー) の図です。 MyISAM テーブルの。 MyISAM のインデックス ファイルはデータ レコードのアドレスのみを保存していることがわかります。 MyISAM では、プライマリ インデックスとセカンダリ インデックス (セカンダリ キー) の間に構造上の違いはありません。ただし、プライマリ インデックスではキーが一意である必要があるのに対し、セカンダリ インデックスのキーは繰り返すことができる点が異なります。 Col2 に補助インデックスを作成すると、このインデックスの構造は次の図のようになります。

MySQLインデックスの実装原理

も B+Tree であり、データ フィールドにはデータ レコードのアドレスが保存されます。したがって、MyISAM のインデックス検索アルゴリズムは、まず B+Tree 検索アルゴリズムに従ってインデックスを検索し、指定された Key が存在する場合、そのデータ フィールドの値を取り出し、そのデータ フィールドの値をそのまま使用します。対応するデータレコードを読み取るためのアドレス。

MyISAM のインデックス作成方法は、InnoDB のクラスター化インデックスと区別するために「非クラスター化」とも呼ばれます。

InnoDBのインデックス実装

InnoDBもインデックス構造としてB+Treeを採用していますが、具体的な実装方法はMyISAMとは全く異なります。

最初の大きな違いは、InnoDB のデータ ファイル自体がインデックス ファイルであることです。上記からわかるように、MyISAM インデックス ファイルとデータ ファイルは分離されており、インデックス ファイルにはデータ レコードのアドレスのみが保存されます。 InnoDB では、テーブル データ ファイル自体は B+Tree によって編成されたインデックス構造であり、このツリーのリーフ ノード データ フィールドには完全なデータ レコードが保存されます。このインデックスのキーはデータ テーブルの主キーであるため、InnoDB テーブル データ ファイル自体が主インデックスになります。

MySQLインデックスの実装原理

図 10 は、InnoDB メイン インデックス (データ ファイルでもあります) の概略図です。リーフ ノードに完全なデータ レコードが含まれていることがわかります。この種のインデックスはクラスター化インデックスと呼ばれます。 InnoDB のデータ ファイル自体は主キーによって集約されるため、InnoDB ではテーブルに主キーが必要です (MyISAM には主キーが明示的に指定されていない場合があります)。MySQL システムはデータを一意に識別できるカラムを自動的に選択します。レコードが存在しない場合、このタイプのカラムの場合、MySQL は InnoDB テーブルの主キーとして暗黙的なフィールドを自動的に生成します。このフィールドの長さは 6 バイトで、タイプは Long です。

MyISAM インデックスとの 2 番目の違いは、InnoDB の補助インデックス データ フィールドには、アドレスではなく、対応するレコードの主キーの値が格納されることです。つまり、InnoDB のすべてのセカンダリ インデックスは、データ フィールドとして主キーを参照します。たとえば、図 11 は Col3 で定義された補助インデックスです。

MySQLインデックスの実装原理

ここでは、英語文字の ASCII コードが比較基準として使用されます。クラスター化インデックスの実装により、主キーによる検索が非常に効率的になりますが、補助インデックス検索ではインデックスを 2 回取得する必要があります。まず、補助インデックスを取得して主キーを取得し、次に主キーを使用して主キー内のレコードを取得します。索引。

さまざまなストレージ エンジンのインデックス実装方法を理解することは、インデックスの正しい使用と最適化に非常に役立ちます。たとえば、InnoDB のインデックス実装を理解すると、長すぎるフィールドをプライマリとして使用することが推奨されない理由が簡単に理解できます。キー。すべての補助インデックスがプライマリ インデックスを参照するためです。プライマリ インデックスが長すぎると、補助インデックスが大きくなりすぎます。別の例として、InnoDB データ ファイル自体が非単調な主キーであるため、InnoDB では非単調なフィールドを主キーとして使用することは得策ではありません。これにより、データ ファイルが B+ ツリーの特性を維持することになります。新しいレコードを挿入する場合、分割調整を頻繁に行うのは非常に効率が悪いため、自動インクリメント フィールドを主キーとして使用することをお勧めします。

上記は、Mysql インデックスの実装原則の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。