MyISAM インデックスの実装MyISAM エンジンはインデックス構造として B+Tree を使用し、リーフ ノードのデータ フィールドにデータ レコードのアドレスを格納します。次の図は、MyISAM インデックスの概略図です。 図8 ここでは、テーブルに合計 3 つの列があると仮定します。Col1 が主キーであると仮定すると、図 8 は MyISAM テーブルのプライマリ インデックス (主キー) の図になります。 MyISAM インデックス ファイルには、データ レコードのアドレスのみが保存されていることがわかります。 MyISAM では、プライマリ インデックスとセカンダリ インデックス (セカンダリ キー) の間に構造上の違いはありませんが、プライマリ インデックスではキーが一意である必要があるのに対し、セカンダリ インデックス キーは繰り返すことができます。 Col2 にセカンダリ インデックスを作成すると、このインデックスの構造は次のようになります。 図9 これも B+ ツリーであり、データ フィールドにはデータ レコードのアドレスが格納されます。したがって、 MyISAM のインデックス検索アルゴリズムは、まず B+Tree 検索アルゴリズムに従ってインデックスを検索します。指定されたキーが存在する場合は、そのデータ フィールドの値が取り出され、次にデータ フィールドの値をアドレスとして使用して対応するデータ レコードが読み取られます。 MyISAM インデックス方式は「非クラスター化」とも呼ばれ、InnoDB のクラスター化インデックスと区別するためにこのように呼ばれています。 #p# InnoDB インデックスの実装InnoDB もインデックス構造として B+Tree を使用しますが、その具体的な実装は MyISAM とはまったく異なります。 最初の大きな違いは、InnoDB のデータ ファイル自体がインデックス ファイルであることです。上記から、MyISAM インデックス ファイルとデータ ファイルは別々であり、インデックス ファイルにはデータ レコードのアドレスのみが保存されることがわかります。 InnoDB では、テーブル データ ファイル自体が B+ ツリーとして編成されたインデックス構造であり、このツリーのリーフ ノード データ フィールドに完全なデータ レコードが格納されます。このインデックスのキーはデータ テーブルの主キーであるため、InnoDB テーブル データ ファイル自体が主インデックスになります。 図10 図 10 は、InnoDB プライマリ インデックス (データ ファイルでもある) の概略図です。リーフ ノードには完全なデータ レコードが含まれていることがわかります。このタイプのインデックスはクラスター化インデックスと呼ばれます。 InnoDB のデータ ファイル自体は主キーによってクラスター化されているため、InnoDB ではテーブルに主キーが必要です (MyISAM には主キーがない場合があります)。明示的に指定されていない場合、MySQL システムはデータ レコードを一意に識別できる列を主キーとして自動的に選択します。そのような列が存在しない場合、MySQL は InnoDB テーブルの暗黙的なフィールドを主キーとして自動的に生成します。このフィールドは 6 バイト長で、長整数型です。 MyISAM インデックスとの 2 番目の違いは、InnoDB 補助インデックス データ フィールドに、アドレスではなく、対応するレコードの主キーの値が格納されることです。つまり、InnoDB のすべてのセカンダリ インデックスは、データ フィールドとしてプライマリ キーを参照します。たとえば、図 11 は Col3 に定義された補助インデックスを示しています。 図11 ここでは、英語文字の ASCII コードを比較基準として使用します。クラスター化インデックスの実装により、主キーによる検索は非常に効率的になりますが、補助インデックス検索には 2 つのインデックス検索が必要です。最初に補助インデックスを検索して主キーを取得し、次に主キーを使用して主インデックスからレコードを取得します。 さまざまなストレージ エンジンのインデックス実装方法を理解することは、インデックスを正しく使用して最適化するのに非常に役立ちます。たとえば、InnoDB のインデックス実装を理解すれば、長すぎるフィールドを主キーとして使用することが推奨されない理由を簡単に理解できます。これは、すべてのセカンダリ インデックスがプライマリ インデックスを参照し、プライマリ インデックスが長すぎるとセカンダリ インデックスが大きくなりすぎるためです。別の例として、InnoDB データ ファイル自体が B+Tree であるため、InnoDB の主キーとして非単調フィールドを使用することはお勧めできません。非単調な主キーでは、B+Tree の特性を維持するために、新しいレコードを挿入するときにデータ ファイルが頻繁に分割および調整されるため、非常に非効率的です。自動増分フィールドを主キーとして使用するのは良い選択です。 次の章では、これらのインデックス関連の最適化戦略について詳しく説明します。 オリジナルリンク: http://www.cnblogs.com/leoo2sk/archive/2011/07/10/mysql-index.html 【編集者のおすすめ】
|
>>: MySQL インデックスの背後にあるデータ構造とアルゴリズムの基礎
[[176814]]映画、ドラマ、テレビ番組、オンライン ビデオなどの配信チャネルのコンテンツ ワー...
人工知能は進化における最も古い謎の 1 つを解くのに役立っていますが、新たな謎ももたらしています。 ...
この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...
機械学習、かっこいいですね。名前からすると、ロボットが一列に並んで座って知識を学習しているように思わ...
クラウドとインテリジェンスの統合は、中国企業が AI アプリケーションの実装の「最後の 1 マイル」...
最近、韓国のテレビ局が韓国初の人工知能キャスターを導入した。この新しく作られたAI女性キャスターは、...
インテリジェント プロセス オートメーション (IPA) とは何ですか?インテリジェント プロセス ...
3月21日、北京でiCityスマートシティカンファレンスが開催され、JD CityがJDグループの第...
1950 年代のコンピューティング ブームにより、「人工知能」という用語が誕生しました (1956 ...
現在、多くの自動運転車開発者は米国カリフォルニア州(以下、「カリフォルニア」という)で路上試験を行う...
GPT-4に次ぐ、李開復のYi-34B-Chatの最新成果が発表されました——アルパカ認定モデル部門...
2011年、Google DeepMindの共同創設者であるシェーン・レッグは、2028年までにAI...
OpenAI は ChatGPT 製品の作成の詳細を明らかにしました。そして、この共有の波は、次の...