MySQL のクラスター化インデックスとクラスター化インデックスの成長の仕組みを理解する

MySQL のクラスター化インデックスとクラスター化インデックスの成長の仕組みを理解する

このノートでは、

  • MySQL の B+Tree インデックスとは何ですか?
  • クラスター化インデックスはどのようにして大きくなるのでしょうか?

少しずつ見ていくと、実はとても簡単に理解できます。

私の以前のメモを読んだことがあるなら、MySQL がメモリ内、つまりバッファ プール内で CRUD を実行することをご存知でしょう。また、メモリ内に MySQL が必要とするデータがない場合、MySQL は IO 操作を通じてディスクからメモリにデータを読み込むこともご存じでしょう。読み取り単位はデータページです

一般的なデータページの長さは次のとおりです。

そうです、実際のデータはデータ ページに保存され、データ ページはメモリ内で双方向リンク テーブルとして編成されます。下記の通り

B+Tree の設定では、主キー インデックスを増分する必要があります。つまり、主キー インデックスを増分する場合は、右側のデータ ページ内のすべてのデータが左側のデータ ページのデータよりも大きくなければなりません。しかし、上の図は明らかに一致していないので、ページ分割によって以下のように調整する必要があります。

さて、思い出してみてください。以前にも聞いたことがあるはずです。MySQL の B+Tree クラスター化インデックスでは、リーフ ノードのみが実際のデータを格納し、非リーフ ノードはインデックス データを格納し、リーフ ノードは双方向のリンク リストによって接続されます。

そうです、B+ツリーのすべてのリーフノードは上図のデータページであり、それらは実際に二重リンクリストによってリンクされています。

読み進めてみましょう。上の図のデータ ページによって接続された二重リンク リストだけを見ると、id=7 のデータ行を取得すると何が起こるでしょうか。

当然、スキャンを最初からやり直す必要があります。

すると、あなたはこう思うかもしれません: B+ ツリーでは主キーが増加する必要があると言ったのではないですか?また、右側のデータ ページ内のすべてのデータが左側のデータ ページのインデックス値よりも大きくなるようにするページ分割メカニズムがあります。バイナリ検索を実行してみませんか?

回答: はい、確かに単一のデータ ページでバイナリ検索を実行することは可能ですが、データ ページ間の組織関係はリンク リストであるため、最初からのトラバーサルは避けられません。

では、MySQL はどうでしょうか?

下図に示すように、MySQLは多くのデータページのインデックスディレクトリを抽象化します。

このインデックス ディレクトリを使用すると、多数のデータ ページ間の検索がはるかに簡単になります。バイナリ検索の能力を直接持つ!

そして、このディレクトリは実際にはデータ ページに存在します。リーフ ノードとの違いは、リーフ ノードには実際のデータが格納されるのに対し、このディレクトリにはインデックス情報のみが格納されることです。

インデックス ページの誕生は、B+Tree のプロトタイプが誕生したことを意味します。

ユーザーが選択を続けると、バッファー プール内のデータ ページの数が増加し、インデックス ページ内のデータ数も増加します。既存のインデックス サイズが 16 KB (データ ページの容量) を超える場合、新しいインデックス情報を格納するために新しいインデックス ページを作成する必要があります。この時点で、B+ツリーは徐々に太くなっていきます。

そして、B+ツリーはBツリーの変種であり、Bツリーは実際には2-3ツリー、2-3-4ツリーなどのM次ツリーの総称であることがわかります。各ノードに格納できる要素が上限に達すると、ツリーは高くなります(前の記事で説明しました)。

次の図のように:

以上がMySQLクラスタ化インデックスの詳細な内容と、クラスタ化インデックスがどのように成長するかであり、一目で理解できます。MySQLクラスタ化インデックスの詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQL 学習チュートリアル クラスター化インデックス
  • MySQLのクラスタ化インデックスと非クラスタ化インデックスの詳細な説明
  • MySQL クラスター化インデックスのページ分割原理の分析例

<<:  Docker で Confluence をデプロイするための完全な手順

>>:  デザイン参考 WordPressウェブサイト構築成功事例

推薦する

Ubuntu環境にAnaconda3をインストールするための完全な手順

目次Anaconda の紹介1. ダウンロード1.1 インストールパッケージを保存するフォルダを作成...

CentOS の Nginx 公式 Yum ソースの設定を詳しく解説

私はプロジェクトの展開にAlibaba Cloudから購入したCentOSを使用しています。最近、プ...

vue フロントエンド HbuliderEslint リアルタイム検証 自動修復設定

目次HBuilderX での ESLint プラグインのインストールカスタム eslint-js ル...

Echarts は 1 つのグラフ内で異なる X 軸を切り替える機能を実装します (サンプル コード)

レンダリング下の画像のような効果を実現したい場合は、読み続けてアニメーション画像に直接進んでください...

JavaScript の数値および数学オブジェクトの概要

目次1. JavaScript における数値2. Javascript の Math オブジェクト1...

LinuxソースコードからTIME_WAITの期間を分析する

目次1. はじめに2. まずLinux環境を紹介しましょう3. TIME_WAIT状態遷移図4. 継...

ES6 配列のコピーおよびフィルメソッド copyWithin() および fill() の具体的な使用法

目次バッチコピー copyWithin()配列を埋めるメソッド fill()指数の計算方法については...

HTML検証 HTML検証

HTML 検証はHTML 検証を指します。これは、HTML ドキュメントを分析し、標準の HTML ...

ES6 における Object.assign() の使い方の詳細な説明

目次2. 目的2.1 オブジェクトにプロパティを追加する2.3 オブジェクトの複製2.4 複数のオブ...

MySQL マスタースレーブレプリケーション切断の一般的な修復方法

目次01 問題の説明02 ソリューション1. 他のスレーブライブラリを見つけてすぐに置き換える2. ...

JavaScript CollectGarbage 関数の例

まず、メモリ解放の例を見てみましょう。 <スクリプト言語="JavaScript&q...

MySQL の order by ステートメントの最適化方法の詳細な説明

この記事では、ORDER BY文の最適化について学びます。その前に、インデックスの基礎的な理解が必要...

MySQL 4.1/5.0/5.1/5.5/5.6の主な違い

バージョン間でのコマンドの違い: innodb ステータスを表示\G mysql-5.1 エンジン ...

Mysql のいくつかの複雑な SQL ステートメント (重複行のクエリと削除)

1. 重複行を見つける blog_user_relation a から * を選択 WHERE (...