三、B-Tree 与 B+Tree的区别

B-Tree 与 B+Tree有什么区别?

B+Tree是基于B-Tree的,大部分数据结构相同,但也有一些区别:
1、B+Tree非叶节点不保存数据信息,只保存关键字和子节点的引用;
2、B+Tree关键字的数据保存在叶子节点中;
3、B+Tree叶子节点是顺序排列的,并且相邻节点具有顺序引用关系;
4、B+Tree由于非叶子节点不存储数据,那么每个节点就可以存储更多的元素,树的层级更少所以查询数据更快,所有数据都存在叶子节点,所以每次查找的次数都相同因而查询速度更稳定;
5、B+Tree通常有两个指针,一个指向根结点,另一个指向关键字最小的叶子结点,因此可以对B+Tree进行两种查找运算:一种是对于关键字的范围查找和分页查找,另一种是从根节点开始,进行随机查找;

举例说明:B+Tree的优势

B+树的查找和B树一样,类似于二叉查找树,从根节点出发自顶向下遍历树,在节点内部使用二分查找来确定走哪一边的指针;
(1)不同的是,B+树中间非叶子节点没有数据(索引元素所指向的数据记录),只有索引,而B树每个结点中的每个关键字都有数据,这样使得同样大小的磁盘页可以容纳更多节点元素,在相同数据量下(1kw),B+树更加“矮胖”,IO操作更少;
B树的数据:
在这里插入图片描述
B+树的数据:
在这里插入图片描述
(2)因为数据的不同,导致查询过程也不同,B树的查找只需找到匹配元素即可,最好情况下查找到根节点,最坏情况下查找到叶子结点,所以性能很不稳定,而B+树每次必须查找到叶子结点,性能稳定;
(3)在范围查询方面,B+树的优势更加明显,B树的范围查找需要不断依赖中序遍历。首先二分查找到范围下限,在不断通过中序遍历,直到查找到范围的上限,整个过程比较耗时;
而B+树的范围查找则简单许多,首先通过二分查找,找到范围下限,然后同过叶子结点的链表顺序遍历,直至找到上限即可,效率更高;

例如:同样查找范围 [3-11],两者的查询过程如下:
B树的查找过程:
在这里插入图片描述
B+树的查找过程:
在这里插入图片描述
下面再做一个推算
1、Innodb存储引擎是以页为单位存储数据,默认一个页的大小是16kb(show variables like ‘innodb_page_size’),一般表的主键类型为int(占4个字节)或BigInteger(占8个字节),指针类型也一般为4或8个字节,如果我们都取最大的8个字节,那么一页(B+Tree中的一个节点)中大概存储16kb/(8byte+8byte)=1024个键值,也就是说一个高度为3的B+Tree索引可以存储1025 * 1025 * 1028 ~ 10亿条记录;
实际情况中每个节点可能不能填充满,因此在数据库中,B+Tree的高度一般都在2~4层,它是一个又矮又胖的数据结构;

2、所有查询都要查找到叶子节点,查询性能稳定;
3、所有叶子节点形成有序链表,便于范围查询;

MyISAM存储引擎B+Tree索引的实现

MyISAM索引文件和数据文件是分离的,索引文件仅保存记录所在页的指针(物理位置),通过这些地址来读取页,进而读取被索引的行;
在这里插入图片描述
上图表字段有Col1(ID)、Col2(age)、Col3(name)三个,其中Col1为Primary Key(主键),树中叶子节点保存的是对应行的物理位置,通过该值,存储引擎再回表中进行查询得到一行完整记录,同时每个叶子节点也保存了指向下一个叶子节点的指针,从而方便叶子节点的范围遍历;
在这里插入图片描述
如果我们在Col2上建立一个辅助索引,就如上图所示,在MyISAM中,主键索引和辅助索引(Secondary key)在结构上没有任何区别,只是主键索引要求key是唯一的,而辅助索引的key可以重复;

非聚集索引

像上面的 MyISAM的索引方式,不管是主键索引(Primary Key)和辅助索引(Secondary Key)数据与索引是分开的,不在一起,我们称为是“非聚集的”,这种索引我们称为“非聚集索引”;

InnoDB存储引擎B+Tree索引的实现

在这里插入图片描述

InnoDB 也是采用 B+Tree数据结构来实现索引,而与MyISAM不同的是InnoDB索引文件和数据文件是存放在一起的,也就是叶节点包含了完整的数据记录,通过索引直接就找到了数据;在这里插入图片描述
InnoDB的辅助索引(Secondary Key)data域存储相应记录主键的值而不是当前索引键的值,也不是数据地址,换句话说,InnoDB的所有辅助索引都引用主键作为data域,所以对于辅助索引,还需要主键值来回表查询到一条完整记录,因此按辅助索引检索实际上进行了二次查询,效率肯定是没有按照主键检索高的;

聚集索引

InnoDB索引文件和数据文件是存放在一起的,我们称为聚集索引,但是这里要注意InnoDB存储引擎所谓“聚集”是指主键索引和数据行紧凑地存储在一起,这种情况下才是聚集索引,如果InnoDB不是主键索引,则索引的叶子节点存储的不是索引的数据,而是该索引行主键的值,那么此时还是非聚集索引;

InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果InnoDB没有显式指定主键,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形,而且是自动增长。

InnoDB 与 MyISAM

在这里插入图片描述
如果所示InnoDB存储引擎中,辅助键索引先通过遍历查到对应的id,
然后再根据id再主键索引中查询,数据保存在主键索引

主键索引,也叫集聚索引,也叫聚簇索引(针对innodb而言);
辅助索引,也叫二级索引,也叫非集聚索引,也叫非聚簇索引;

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值