1) 主キー インデックス:
MyISAM エンジンはインデックス構造として B+Tree を使用し、リーフ ノードのデータ フィールドにはデータ レコードのアドレスが格納されます。次の図は、Myisamプライマリキーインデックスの概略図です。 ) MyISAM テーブルの。 MyISAM のインデックス ファイルにはデータ レコードのアドレスのみが保存されていることがわかります。
2) セカンダリキー
Col2 に補助インデックスを作成すると、このインデックスの構造は次のようになります:
これも B+Tree であり、データ フィールドにはデータ レコードのアドレスが保存されます。したがって、
MyISAM のインデックス検索アルゴリズムは、まず B+Tree 検索アルゴリズムに従ってインデックスを検索し、指定された Key が存在する場合、そのデータ フィールドの値を取り出し、次にデータ フィールドの値を取得します。対応するデータレコードを読み取るためのアドレスとして使用されます。
MyISAM のインデックス作成方法は、InnoDB のクラスター化インデックスと区別するために「非クラスター化」とも呼ばれます。
2. InnoDB インデックスの実装InnoDB もインデックス構造として B+Tree を使用しますが、具体的な実装方法は MyISAM とはまったく異なります。
1) 主キー インデックス:
MyISAM インデックス ファイルとデータ ファイルは別個であり、インデックス ファイルにはデータ レコードのアドレスのみが保存されます。 InnoDB では、テーブル データ ファイル自体は B+Tree によって編成されたインデックス構造であり、このツリーのリーフ ノード データ フィールドには完全なデータ レコードが保存されます。このインデックスのキーはデータ テーブルの主キーであるため、InnoDB テーブル データ ファイル自体が主インデックスになります。
(図 inndb プライマリ キー インデックス) は、InnoDB プライマリ インデックス (データ ファイルでもあります) の概略図であり、リーフ ノードに完全なデータ レコードが含まれていることがわかります。この種のインデックスは、クラスター化インデックスと呼ばれます。 InnoDB のデータ ファイル自体は主キーによって集約されるため、InnoDB ではテーブルに主キーが必要です (MyISAM には主キーが明示的に指定されていない場合があります)。MySQL システムはデータを一意に識別できるカラムを自動的に選択します。レコードが存在しない場合、このタイプのカラムの場合、MySQL は InnoDB テーブルの主キーとして暗黙的なフィールドを自動的に生成します。このフィールドの長さは 6 バイトで、タイプは Long です。
2). InnoDB の補助インデックス
InnoDB のすべての補助インデックスは、主キーをデータ フィールドとして参照します。たとえば、以下の図は、Col3 で定義された補助インデックスを示しています。
InnoDB テーブルは、クラスター化インデックス に基づいて構築されます。したがって、InnoDB のインデックスは、非常に高速な主キー検索パフォーマンスを提供できます。ただし、その補助インデックス (セカンダリ インデックス、つまり非主キー インデックス) には主キー列も含まれるため、主キーが比較的大きく定義されている場合、他のインデックスも大きくなります。テーブルに多数のインデックスを定義する場合は、主キーをできるだけ小さく定義するようにしてください。 InnoDB はインデックスを圧縮しません。
テキスト文字の ASCII コードが比較基準として使用されます。 クラスター化インデックスの実装により、主キーによる検索が非常に効率的になりますが、補助インデックス検索ではインデックスを 2 回取得する必要があります。まず、補助インデックスを取得して主キーを取得し、次に主キーを使用して主インデックス内のレコードを取得します。 。
さまざまなストレージ エンジンのインデックス実装方法は、インデックスの正しい使用と最適化に非常に役立ちます。たとえば、InnoDB のインデックス実装を理解すると、過度に長いフィールドを使用することが推奨されない理由が簡単に理解できます。主キー。すべての補助インデックスは主インデックスを参照するため、主インデックスが長すぎるとセカンダリ インデックスが大きくなりすぎます。別の例として、InnoDB データ ファイル自体が非単調な主キーであるため、InnoDB では非単調なフィールドを主キーとして使用することは得策ではありません。これにより、データ ファイルが B+ ツリーの特性を維持することになります。新しいレコードを挿入する場合、分割調整を頻繁に行うのは非常に効率が悪いため、自動インクリメント フィールドを主キーとして使用することをお勧めします。
InnoDB インデックス と MyISAM インデックス の違い:
まず、メインのインデックスである InnoDB データ ファイル自体の違いは、インデックス ファイルです。 MyISAMのインデックスとデータは分離されています。
2 番目の違いは補助インデックスです。InnoDB の補助インデックス データ フィールドには、アドレスの代わりに、対応するレコードの主キーの値が格納されます。 MyISAM のセカンダリ インデックスとプライマリ インデックスには大きな違いはありません。
MySql インデックス アルゴリズムの原理の分析 (わかりやすい、B ツリーについてのみ話します)
以上がMyISAMとInnoDBストレージエンジンのインデックス実装方法の違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。