MySQL インデックスのデータ構造とアルゴリズム: インデックスの実装

MySQL インデックスのデータ構造とアルゴリズム: インデックスの実装

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

【編集者のおすすめ】

  1. MySQL でインデックス組織構造を作成し最適化するためのアイデア
  2. Weibo: データベースをどのように最適化しますか?
  3. MySQL のヒント: 関連パラメータによる制限の最適化
  4. MySQL データベースの最適化 (パート 2) MySQL データベースの高可用性アーキテクチャ ソリューション
  5. MySQL データベースの最適化 (パート 1) 単一マシンの MySQL データベースの最適化

<<:  パフォーマンス最適化技術: アルゴリズム

>>:  MySQL インデックスの背後にあるデータ構造とアルゴリズムの基礎

ブログ    
ブログ    

推薦する

...

IEEE コンピュータ協会が 2023 年の技術トレンド予測評価を発表

コンピューターサイエンスとエンジニアリングの主要会員コミュニティである IEEE コンピューターソサ...

...

OpenAIがテキストから動画を生成するAIジェネレーター「Sora」をリリース

OpenAI が Sora をリリースし、テキストからビデオへの AI コンテンツ生成競争に参入。 ...

テレンス・タオがGPT-4のチャット履歴を公開、研究アシスタントを入手するにはここをクリック

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

自動運転が原因でしょうか?上海の地下鉄で乗客がホームの網戸に挟まれて死亡した。この悲劇の責任は誰にあるのだろうか?

1月22日午後、上海地下鉄15号線で重大事故が発生した。千安路駅のプラットホームで、乗客が電車から...

ガイド | NLP の問題の 90% を解決する方法を段階的に教えます

[[279869]]テキストデータはどこにでもある既存の企業でも、新しいサービスを開発している企業で...

機械学習の3つの時代におけるコンピューティングのトレンド

2010 年以前は、トレーニング コンピューティングの開発はムーアの法則に沿って 2 年ごとに 2 ...

浙江大学のロボット魚がネイチャー誌に登場:マリアナ海溝の奥深くまで到達、画期的な進歩

人類は初めて、水深1万メートルでのソフトロボットの深海制御と深海自律遊泳実験を達成し、ロボット工学分...

Python が Java や C/C++ に勝って機械学習に最適な言語である理由!

Python は、1989 年にオランダ人の Guido van Rossum によって発明され、...

調査結果: 回答者の 64% が生成 AI による作業の功績を認めている

Salesforce が実施した調査では、生成 AI の使用に関する明確なポリシーが存在しない状況で...

OPPO 広告想起アルゴリズムの実践と調査

1. 背景1. 古いリコールアーキテクチャ上の図の左上部分は、最初にリコールしてからソートする一般的...

FlashAttention v2 は標準の Attention より 5 ~ 9 倍高速です。大規模なモデルで使用されます。

最近、GPT-4(コンテキスト長32k)、MosaicMLのMPT(コンテキスト長65k)、Anth...

Microsoft の 38 TB の内部データが漏洩!秘密鍵と3万件以上の仕事上の会話が漏洩、その背後にある理由は衝撃的

何か大きなことが起こりました!数か月前、マイクロソフトの AI 研究チームは、大量のオープンソースの...