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

推薦する

シンプルな計算機を実装するためのネイティブ js

この記事の例では、参考までに簡単な計算機を実装するためのjsの具体的なコードを共有しています。具体的...

Vueのアイデアを使ってストレージをカプセル化する方法

目次背景関数目的アイデアの源成し遂げるセット得るプロパティの削除拡張機能を禁止するもっている要約する...

Mysql | ワイルドカード(%、_ など)を使用したファジークエリの詳細な説明

ワイルドカードのカテゴリ: %パーセント ワイルドカード: 任意の文字が任意の回数出現できることを示...

TypeScript 列挙型

目次1. 概要2. デジタル列挙2.1 逆マッピング3. 文字列の列挙4. const列挙5. まと...

Mac MySQL のルートパスワードをリセットするチュートリアル

免責事項:このパスワード リセット方法は、Homebrew によってインストールされた MySQL ...

macOS での MySQL 8.0.17 のインストールと簡単な設定チュートリアル

私が書いた内容が理解できない場合は、インターネット上に理解できるチュートリアルがない可能性があります...

柔軟で安定した高品質の HTML および CSS コード標準を作成するためのガイド

黄金律常に同じコーディング標準セットに従ってください。同じプロジェクトに何人の人が関わっているかに関...

JSscriptタグの属性は何ですか

JS スクリプト タグの属性は何ですか? charset : オプション。 src 属性で指定された...

nodejs + koa + typescript の統合と自動再起動に関する問題

目次バージョンノートプロジェクトを作成する依存関係をインストールするコンテンツの記入src/serv...

mysql 行列変換サンプルコード

1. 需要3 つのテーブルがあります。一定期間にわたるさまざまな抗生物質感受性の結果、つまり rep...

MySQL 5.7.17 のインストールと使用方法のグラフィックチュートリアル

MySQL は、スウェーデンの会社 MySQL AB によって開発され、現在は Oracle が所有...

React NativeプロジェクトでLottieアニメーションを使用する方法

Lottie は、Airbnb が開発した iOS、Android、React Native 向けの...

WeChatアプレット学習ノート: ページ構成とルーティング

最近、小さなプログラムの開発を勉強して見直しており、学習結果のいくつかをメモしています。公式の We...

HTML タグのネスト規則の紹介

XHTML タグには、div、ul、li、dl、dt、dd、h1~h6、p、a、addressa、s...

MySQL で 2 つのテーブルをクエリする場合の from と join の違いの概要

序文MySQL では、複数テーブル結合クエリは非常に一般的な要件です。複数テーブルクエリを使用する場...