Mysql的索引结构——B+树

1.B树和B+树的基本结构和区别

1.1 B树的结构

在这里插入图片描述
B树的特点:
(1)每个节点可以存储多个数据;
(2)节点中的多个数据是排好序的;
(3)B树的中间节点也可以存储数据。

1.2 B+树的结构

在这里插入图片描述
B+树的特点:
(1)B+树的叶子节点才会存储数据,中间节点存储的是指向数据的中间索引值;
(2)B+树的叶子节点之间是由**双向指针(这个图中的B+树是单向的,因为这个是学术上的B+树,mysql中的B+树使用的是双向指针)**相连的;
(3)B+树的每个节点内可以存储多个元素,并且每个元组在节点内部是排好序的;

1.3 mysql存储数据的基本单位(页)

(操作系统中读取数据也是采用页作为单位,一页为4kb的数据。)
注意:InnoDB也是采用的是页作为数据存取的基本单位,一页为16kb的数据。
为什么会存在页结构呢?
假如我们不适用页作为数据的基本存取单位,那么我们每次去磁盘读取数据的时候只读取一条记录的话,当我们需要读取多条记录的时候就会造成多次磁盘的IO操作,我们都知道磁盘的IO操作相对于CPU的运行速度而言是非常慢的,因此就需要降低IO的频次,就采用页结构,让mysql一次可以存取到一页的数据,也就是一次IO操作可以获得16kb的数据。大大降低的IO的时间消耗。

1.4 页的逻辑结构

在这里插入图片描述
当存储数据时,对应的内部结构:
在这里插入图片描述
页目录中的一个目录项所占的数据其实是很小的,一个目录只包含一个主键值和一个地址值,主键值表示的是这个目录锁对应的数据段的最小主键,地址值指向的是最小主键对应的数据的地址。
注意:在InnoDB 中,一个目录项对应这个6条记录
当一页存不下的时候,就会新开另外一页,并且两页之间有指针相连
在这里插入图片描述
在mysql中,将B+树的节点称之为页,也就是将一页看成一个树中的节点,B+树的中间节点是不存储数据的,只是存储的是指向数据的索引,所以又将中间页称之为索引页,叶子页称之为数据页。
在这里插入图片描述
注意:这里的指针是双向指针,例如我们执行select * from table where id >5,此时mysql的执行是先找到id=5的数据,然后再将该数据之后的数据返回,这里就是从前往后指向。但是当我们需要查询id<5的时候呢?同样先找到id=5的数据,然后从后往前找,所以就需要一个直线前面节点的指针,所以mysql中B+树的叶子节点之间是双向的指针。

在mysql中,一般将表中记录数大于2500万的表称之为大表,为什么呢?
因为我们知道,mysql中采用的是B+树进行数据的索引存储,B+树中的一个页可以存储多个数据(针对于叶子页而言)或索引(针对于索引页而言),我们大概可以计算得出,一个两层的B+树,大概可以保存的记录数为2500万行,所以如果数据记录超过了,那么就会变成3层的B+树,查找性能就会明显变慢,此时我们建立索引作用较小了,就需要考虑分表了。

1.5 联合索引

联合索引的叶子节点存储的是对应的主键id
在这里插入图片描述
假如我们执行一个sql语句:select * from table where a = 1 and b = 1 and c = 1,那么就会根据这个联合索引abc在联合索引树上找到对应的那个位置,那个位置存储的数据是对应的满足条件的主键的id,然后通过这个主键id再去用主键生成的索引树中去找数据,这个过程叫做回表。因此,我们可以知道,只有主键建立的索引树的叶子节点才会有完整的表数据,其他的联合索引对应的索引树不存在完整的行数据,只是一部分索引列对应的数据和主键对应的数据。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值