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ウェブサイト構築成功事例

推薦する

VueのSSRサーバーサイドレンダリング例の詳細な説明

サーバーサイドレンダリング (SSR) を使用する理由検索エンジンのクローラーが完全にレンダリングさ...

Postman 自動インターフェーステストの実践

目次背景説明GETリクエストの作成事前リクエストスクリプトで署名を作成するスクリプトは環境変数に書き...

条件によるMysqlカウントの複数の実装方法を詳細に解説

最近、あるウェブサイトのバックエンドに一連の統計機能を追加していたのですが、条件によるカウントが必要...

divの適応高さは残りの高さを自動的に埋めます

シナリオ 1: HTML: <div class="outer"> ...

JSはプログレスバーをドラッグして要素の透明度を変更することを実装しています

今日ご紹介したいのは、ネイティブ JS を使用してプログレス バーをドラッグし、要素の透明度を変更す...

HTML割引価格計算の実装原理とスクリプトコード

コードをコピーコードは次のとおりです。 <!DOCTYPE HTML PUBLIC "...

純粋なJSを使用してセカンダリメニュー効果を実現します

この記事の例では、セカンダリメニュー効果を実現するためのJSの具体的なコードを参考までに共有していま...

Ubuntu は、Mysql+Keepalived の高可用性実装 (デュアルアクティブ ホットスタンバイ) を構築します。

Mysql5.5 デュアルマシン ホットスタンバイ実装 2つのMySQLをインストールするMySQ...

Web コンポーネントの内部イベント コールバックと問題点の分析

目次前面に書かれたWC とは何でしょうか?現在の欠陥1. コンポーネント内部イベントのコールバック2...

関数の分類の詳細な説明とJavascriptでのこのポイントの例

JS で関数を定義する 3 つの方法例を挙げて説明しましょう。 <スクリプト> //メソ...

MySQLの半同期の詳細な説明

目次序文MySQL マスタースレーブレプリケーションMySQL でサポートされているレプリケーション...

Tomcat サーバーの応答が遅い場合の解決策

1. 分析的思考1. 機械自身の理由を排除する2. サーバーパフォーマンス分析3. プロジェクト自体...

MySql 認証に基づく vsftpd 仮想ユーザー

目次1. MySQLのインストール1.2 テーブル、データベース、ユーザーを作成する1.3 リモート...

Docker 用ビジュアル UI 管理ツール Portainer のインストールと使用方法の分析

Portainer は、ステータス表示パネル、アプリケーション テンプレートの迅速な展開、コンテナ ...