mysql-B+ツリーインデックス InnoDB

B+ツリーの基礎入門(バランス・高低差が2以内)

B+ ツリーは、効率的な挿入、削除、検索操作を可能にする B ツリーの拡張機能です。

B ツリーでは、キーとレコードの両方を内部ノードとリーフ ノードに保存できます。ただし、B+ ツリーでは、レコード (データ) はリーフ ノードにのみ保存でき、内部ノードはキー値のみを保存できます。

B+ ツリーのリーフ ノードは、検索クエリをより効率的に行うために、単一リンク リスト内で相互にリンクされます。

B+ ツリーは、メイン メモリに格納できない大量のデータを格納するために使用されます。メイン メモリのサイズは常に制限されているため、B+ ツリーの内部ノード (レコードにアクセスするためのキー) はメイン メモリに格納され、リーフ ノードは補助メモリに格納されます。

B+ ツリーの内部ノードは通常、インデックス ノードと呼ばれます。

子ノードを持つものは内部ノード、子ノードがないものはリーフノードです。

ディスクストレージとinnodbの関係の概要

システムがディスクからメモリにデータを読み取るときの基本単位はディスクブロック(ブロック)であり、同じディスクブロックにあるデータは必要な分だけではなく一度に読み出されます。

InnoDB ストレージ エンジンには、ディスク管理の最小単位であるページ (Page) の概念がありますInnoDB ストレージ エンジンの各ページのデフォルト サイズは 16KB で、ページ サイズはパラメータ innodb_page_size を使用して 4K、8K、または 16K に設定できます。

ただし、システム内の 1 つのディスク ブロックのストレージ スペースはそれほど大きくないことが多いため、InnoDB はディスク スペースを申請するたびに、連続したアドレスを持つ複数のディスク ブロックを使用して 16 KB のページ サイズを実現します。InnoDB は、ディスク データをメモリに読み取るときに基本単位としてページを使用します。データをクエリするときに、ページ内の各データがデータ レコードの場所を特定するのに役立つ場合、ディスク I/O の数が削減されます。クエリ効率が向上します。

B+treeの詳細紹介

  1. 非リーフ ノードはキーと値の情報のみを保存します。

  1. すべてのリーフ ノード間にはチェーン ポインターがあり、範囲クエリの効率を向上させることができます。

  1. データ レコードはリーフ ノードに保存されます。

  1. すべてのリーフ ノード (つまり、データ ノード) は、単一のリンク リスト構造です。したがって、B+Tree では、主キーの範囲検索とページ検索、およびルート ノードから開始するランダム検索の 2 つの検索操作を実行できます。

BツリーとB+ツリーの比較

INNODB

InnoDB使用了聚簇索引(Clustered),即所有二级索引聚集在主键索引上,对InnoDB存储引擎表的任何访问,最终一定要搜索主键索引树

在InnoDB中,二级索引上没有实际的数据,存储的是主键索引的值。这样的话,如果是基于二级索引的查询,会先在二级索引上搜索得到主键索引的值,然后再去主键索引树上搜索,得到最终的行数据。

这就意味着,至少有一次索引查找,可能会有两次索引查找,其中一定有一次主键索引查找

在InnoDB中,主键要设计的尽量主键越小二级索引也会越小

如果主键用更大的数据类型,由于二级索引上有主键索引的值,那么不只是主键索引树变的更大更高,其他的二级索引树也会更大更高

二级索引:所有不是主键索引的索引

树高度决定因素

阶树:描述一颗 B 树时需要指定它的阶数,阶数表示了一个节点最多有多少个孩子节点,一般用字母 m 表示阶数,阶树也决定了树的高度

根节点的关键字数量范围:1 <= k <= m-1,非根节点的关键字数量范围:m//2 <= k <= m-1,超出范围就会分裂新的内部节点。

树高度越小,查询io操作就会越少,读写也就越快

おすすめ

転載: blog.csdn.net/xiaofeixia666888/article/details/129753460