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の詳細紹介
非リーフ ノードはキーと値の情報のみを保存します。
すべてのリーフ ノード間にはチェーン ポインターがあり、範囲クエリの効率を向上させることができます。
データ レコードはリーフ ノードに保存されます。
すべてのリーフ ノード (つまり、データ ノード) は、単一のリンク リスト構造です。したがって、B+Tree では、主キーの範囲検索とページ検索、およびルート ノードから開始するランダム検索の 2 つの検索操作を実行できます。
BツリーとB+ツリーの比較
INNODB
InnoDB使用了聚簇索引(Clustered),即所有二级索引聚集在主键索引上,对InnoDB存储引擎表的任何访问,最终一定要搜索主键索引树
在InnoDB中,二级索引上没有实际的数据,存储的是主键索引的值。这样的话,如果是基于二级索引的查询,会先在二级索引上搜索得到主键索引的值,然后再去主键索引树上搜索,得到最终的行数据。
这就意味着,至少有一次索引查找,可能会有两次索引查找,其中一定有一次主键索引查找
在InnoDB中,主键要设计的尽量小,主键越小,二级索引也会越小
如果主键用更大的数据类型,由于二级索引上有主键索引的值,那么不只是主键索引树变的更大更高,其他的二级索引树也会更大更高
二级索引:所有不是主键索引的索引
树高度决定因素
阶树:描述一颗 B 树时需要指定它的阶数,阶数表示了一个节点最多有多少个孩子节点,一般用字母 m 表示阶数,阶树也决定了树的高度
根节点的关键字数量范围:1 <= k <= m-1,非根节点的关键字数量范围:m//2 <= k <= m-1,超出范围就会分裂新的内部节点。
树高度越小,查询io操作就会越少,读写也就越快