MYSQL索引2:底层原理B+Tree

1.插入ID无序数据

Insert Into emp values(5, 'd',55);

Insert Into emp valoos(1, 'a',11);

Insert Into emp values(2, 'b',2):

Insert Into emp values(4, 'a', 4):

Insert Into emp values(3, 'e‘,33));

查询结果:

IDNAMEWORK_AGE
1a11
2b2
3e33
4a4
5d55

2.查询结果居然是排序的。 id:主键素引

3.主键索引进行排序,为什么要排序?

快速查询(因为排序后能准确定位,若不排序需要全部搜索直到获取到需要的元素。)

但是当ID特别大时,需要查询的速度也会慢些,这是MYSQL的做法是:不仅排序,而且做分页(每一页的默认存储大小:16 KB)。并会多一层(顶层的)页目录,存储每一页开头的主键值,不存储其数据(这就是B+Tree的存储方式)。

甚至还会在目录的基础上再加一层,一般三层就够存入近10亿的数据量了。

B+Tree相对于B-Tree(B树)有几点不同:

1.非叶子节点只存储键值信息。

2.所有叶子节点之间都有一个链指针。

3.数据记录都存放在叶子节点中。

主要的区别:B树的叶子节点必须存数据,如果页目录也存储这些数据,那么页目录的存储的叶子会少很多,结果就是同样的数据,树的深度可能会更深,增大查询时磁盘的I/O次数,影响查询效率。

B+Tree的层数为3层,对应的磁盘I/O读取次数:1-3次,如果是主键索引查询那么最多两次,因为顶层是常驻内存的,只需查询上第二层目录的与叶子节点上的,共两次。那么3次的情况是为什么?对于普通索引(非聚簇索引),会先查name索引(也是树)获取ID,再去用主键索引查询(也称回表——辅助索引拿到主键id之后,要再去遍历聚集索引的B+树的过程),也就是说并不是直接那这个列去查询,而且先获取到对应的主键值再去查,这就是多出来的一次。

B+Tree高度一般为2-4,MYSQL的innoDB存储引擎设计是将根节点作为常驻内存的,那么在B+Tree上面最多只需读取1-3次磁盘I/O操作。

介绍一下MYSQL存储数据结构

结语:放入数据时,会基于数据做排序,排序后会将数据以链表的形式链接起来。同时,MYSQL为进一步优化,是以B+Tree的形式做存储,也就一页一页的存储,一页默认大小16KB。一个三层的B+Tree存储数据近10亿,一般B+Tree高度为2-4,基于主键索引(聚簇索引)查找只需读取1-3次磁盘I/O。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值