mysqlインデックスのB + Treeランディングフォームを深く理解する(3)

前回の記事に続き、前回の記事では主にB + Treeのさまざまな利点を学びました。この記事では、MySQLでのB + Treeのランディングフォームについて学びましょう。

B +ツリーランディングフォーム

1つはMySQLアーキテクチャ

MySQLは、プラグインストレージエンジンをサポートするデータベースです。MySQLでは、各テーブルは、作成時に使用するストレージエンジンを指定できます。

MySQLで最も一般的に使用される2つのストレージエンジン:

  • InnoDB
  • MyISAM

MySQLデータはディスク上にファイルの形で保存されます。このデータディレクトリのアドレスを見つけることができます。MySQLにはそのようなパラメータがあります。

SHOW VARIABLES LIKE 'datadir';

ここに画像の説明を挿入
各データベースにはディレクトリがあり、xhcという新しいデータベースを作成してから、xhcフォルダがあります。
ここに画像の説明を挿入
このデータベースに、studentとteacherの2つのテーブルを作成しまし
た。xhcディレクトリに入ると、作成したテーブル名に対応するファイルがいくつかあることがわかりました。
ここに画像の説明を挿入
ここでは、各InnoDBテーブル(赤)に2つのファイル(.frmと.ibd)があり、MyISAMテーブル(黄色)に3つのファイル(.frm、.MYD、.MYI)があることがわかります。

1つは同じファイル.frmです。.frmMySQLテーブル構造によって定義されたファイルであり、テーブルの作成時に選択したストレージエンジンに関係なく生成されます。
主に、他の2つのファイルがMySQLのさまざまなストレージエンジンのインデックスを実装する方法を見ていきます。

InnoDB

InnoDBは1つのファイル(.ibdファイル)のみで、それを配置するインデックスはどこにありますか?
InnoDB内部では格納されたデータを整理するためのインデックスのマスターキーであるため、インデックスとデータファイルは**の同じファイルです。内部ibd **ファイル。
InnoDBの主キーインデックスのリーフノードに、データを直接格納します。
ここに画像の説明を挿入
クラスター化インデックス(クラスター化インデックス)とは何ですか?

つまり、インデックスキー値の論理的な順序は、テーブルデータ行の物理的な保存順序と一致しています。(たとえば、辞書のディレクトリは拼音でソートされ、コンテンツは拼音でソートされます。このようなディレクトリは拼音でソートされ、クラスター化インデックスと呼ばれます)。
InnoDBでは、データを整理する方法(クラスター化インデックス整理テーブル)と呼ばれるため、主キーインデックスはクラスター化インデックスであり、非主キーは非クラスター化インデックスです。

InnoDBの主キーがこのように格納されている場合、名前フィールドに作成した通常のインデックス(補助インデックス)など、主キー以外のインデックスはどのようにデータを格納および取得しますか?
ここに画像の説明を挿入
InnoDBでは、主キーインデックスと補助インデックスは次のとおりです。一次と二次の区別があります。

補助インデックスには、補助インデックスと主キー値が格納されます。補助インデックスクエリを使用する場合、主キーインデックスは主キー値に従ってクエリされ(テーブル操作に戻る)、最終的にデータを取得します。(1つの例外があります)

これは、プロの用語「関係テーブルに背を」。
インデックスを使用して、SQL文のクエリとフィールドのフィールドがまったく同じフィールドである場合、クエリは、主に基づいて、主キーインデックス内のクエリデータする必要はありませんキー値(このプロセスは「テーブルに戻る」と呼ばれます)が、直接戻ります。例えば:

select name from student where name = 'zhangsan'

但是如果是下面这种写法,就需要进行回表操作了,因为辅助索引中,没有age的值,只好拿着主键值去主键索引中查询,最终取得数据
select name,age from student where name = '张三'

InnoDBインタビューの質問

  • 主キーのディスクアドレスではなく、主キーの値が二次インデックスに格納されるのはなぜですか?主キーのデータ型が比較的大きい場合、アドレスよりも多くのスペースを消費しますか?
    回答:主キーインデックスは分割してマージすると、アドレス値が変更され、セカンダリインデックスに同期されなくなります。(主キーは兄ですが、弟(二次インデックス)に兄の家を教える必要がありますか?)
  • テーブルに主キーがない場合はどうなりますか
    1. 主キー(PRIMARY KEY)を定義すると、InnoDBは主キーをクラスター化インデックスとして選択します。
    2. 主キーが明示的に定義されていない場合、InnoDBは、NULL値を含まない最初の一意のインデックスを主キーインデックスとして選択します。
    3. そのような一意のインデックスがない場合、InnoDBは組み込みの6バイト長のROWIDを非表示のクラスター化インデックスとして選択します。これにより、行レコードが書き込まれるときに主キーが増加します。(ただ理解してください)

MyISAM

MyISAMには、他に2つのファイルがあります。

  • .MYDファイル(Dはデータを表す)はMyISAMデータファイルであり、すべてのテーブルデータなどのデータレコードを教師のテーブルに保存します。
  • .MYIファイル(インデックスの略)はMyISAMインデックスファイルであり、インデックスを格納します。たとえば、idフィールドに主キーインデックスを作成した場合、主キーインデックスはこのインデックスファイルにあります。

つまり、MyISAMでは、インデックスとデータは2つの別個のファイルです。
では、mysqlはどのようにしてインデックスに基づいてデータを見つけるのでしょうか?

MyISAMのB + Treeでは、リーフノードにデータファイルに対応するディスクアドレスが格納されます。したがって、
インデックスファイル.MYIからキー値見つけた後、データファイル.MYDに移動して、対応するデータレコードを取得します。
ここに画像の説明を挿入
次の記事
mysqlインデックス(4)インデックスの使用原則の詳細な理解

おすすめ

転載: blog.csdn.net/nonage_bread/article/details/108427889