MySQL索引(一)——B-Tree索引介绍

注:本文章是作者学生时期所作。如有错误,请大佬指出

B-Tree树

N叉B-Tree,一个节点最多包含 N - 1 个数据、N 个指针

案例演示:

以5叉B-Tree为例,插入数据 C N G A H E K Q M F W L T Z D P R X Y S的过程如下图
    注: 因为是5叉树,所以,一个节点最多存放4个数据,5个指针。
           当要存放的数据多于4个的话, 两边节点分裂,中间节点升为父节点
(1):插入数据C、N、G、A,这四个数据可以放入一个节点中,并且在节点中有序排列
MySQL索引(一)——B-Tree索引介绍_第1张图片
(2):当再插入数据H时,如果再插入这个节点,数据就多于4个了,
             所以中间节点上升,两边节点分裂
MySQL索引(一)——B-Tree索引介绍_第2张图片
(3):再插入数据E时,因为E比G小,所以插入G左边的节点,插入K,Q时,因为K,Q大于G,
            所以插入G右边的节点。 同理,插入的数据再各自节点内,按顺序排列
   MySQL索引(一)——B-Tree索引介绍_第3张图片
(4):当插入数据M时,因为M比G大,所以要插入G右边的节点,
            但是插入该节点的话,数据变成了5个,中间数据应向上分裂
MySQL索引(一)——B-Tree索引介绍_第4张图片
(5):插入F、W、L、T时,因为F比G小,所以插入最左边节点,W、T比M大,所以插入最右边节点,L介于G、M之间,所以插入G、M之间的节点
MySQL索引(一)——B-Tree索引介绍_第5张图片
(6):插入数据Z时,按理说应该向最右边的节点插入,但是节点数据超过了5个,向上分裂
             MySQL索引(一)——B-Tree索引介绍_第6张图片
(7):插入数据D时,应该插入最左边的节点,同样,因为数据多于4个,向上分裂
            之后插入 P、R、X、Y的时候,依次插入即可
MySQL索引(一)——B-Tree索引介绍_第7张图片
(8):最后,插入数据S,因为向M、T之间的节点插入数据之后,节点数据会多于4个,所以会向上分裂,但是分裂之后 父节点的数据也会多于4个,所以再向上分裂,如下图
MySQL索引(一)——B-Tree索引介绍_第8张图片

B-Tree索引:

数据页:

在 MySQL 中,数据存储是以数据页为单位的,默认大小是 16KB。
我们插入一条数据并不是将其直接插入到磁盘中,而是将这条数据记录保存到一个数据页中。
只要这个数据页还有空间, 我们就插入到这个数据页当中, 否则,再申请一块磁盘空间作为新的数据页。
所以,MySQL中的一个数据页就相当于上述B-Tree结构中的一个结点,我们插入的一条记录就相当于 上述 B-Tree结构中的一个数据
(1)MySQL通过磁盘 IO 将数据读取到内存时,并不是一次读取一个数据,一次是读取一个数据页 相当于读取一个 B-Tree 的结点
(2):相比于再内存中的操作,磁盘IO的操作是非常耗时的。
                我们提高查询的效率,说白了就是减少磁盘IO的次数

B-Tree索引的结构示意图:

MySQL索引(一)——B-Tree索引介绍_第9张图片
MySQL索引(一)——B-Tree索引介绍_第10张图片
注:B-Tree索引,每一个数据页,也就是每一个结点,保存的不仅仅是一条记录的索引值,
        它保存了一条记录所有的数据(和下文的 B+Tree有区别)

你可能感兴趣的:(MySQL,mysql,sql,数据库)