关于Mysql索引的B树到B+树结构分析

前提知识

这篇博客主要是为了分析B树及B+树作为索引的应用原因,而不是这两种树结构的内存模型,所以很多知识点都是简单的说了哈。

查找方法

首先B+树的索引结构,在查找时使用的是二分查找的方法。类似使用二分查找的还有很多,比如Redis的跳表查询,kafuka的日志消息查询也是使用这种方法。时间复杂度O(logn)

计算机预读取机制

这个就属于计算机机制的方面内容了,简单来说:在计算机读取到一个字节,大概率也会读取到其周围的数据,所以计算机会提前将你读取数据的周围数据同时加载到内存,加快你访问周围数据的速度。

B树

B树在每个节点上都用来存储多个关键字(也就可以理解我们说的是索引),如果我们将节点大小设置成磁盘大小,那么我们在查找到一个在该节点的数据时,通过预读机制周围数据同时加载到内存中,所以对于B树来说绝大多数的查询都发生在内存中。
这里可以提一下关于为什么不用红黑树,由于红黑树H高的问题,可能导致数据距离较远,所以查询时会多次去磁盘读取,效率低下不及B树。

B+树

关于B+树,与B树最大的不同处,也就是B+树只用叶子节点(就是树最下方的节点)存储数据,非叶子节点存储指针指向下一个节点(理解为是用来导航的),Mysql也是正是利用这点在作为索引时相比B树提高访问速度,稍后解释。

查找过程分析

先给出一个树结构,我们下面就根据这个图来分析B树和B+树的作为索引时的查找过程。
树结构
这张图不是很严谨,主要作为一个树结构来看,而不是作为B树或B+树结构来看。
其实我们绝大多数的根据索引查询,分为两种。也就是根据Id查找一条数据、范围查找数据。

单条数据查找

  1. B树单条数据查找过程
    首先我们从根节点一次一次的通过根节点向不同的叶子节点遍历,直到找到存放数据的节点。但是我们这里注意一点,由于B树是每个节点上都存放数据,所以我们在查找到一条数据时,通过预加载会把这个节点的数据加载到内存,以便加快访问周围数据。
  2. B+树单条数据查找过程
    遍历的方式与B树一摸一样,没有任何区别。但是由于B+树的数据都存放在叶子节点上,所以我们通过一个预加载时,可以加载更多数据到内存当中。
  3. 比较
    在单条数据的读取时,最大的区别就是,B+树结构通过预加载机制可以比B树结构加载更多周围数据到内存中。这样一些情况下B+树在访问数据可能比B树更快。
    B+树>=B树,B+树小胜。

范围数据查找

  1. B树范围数据查找过程
    B树在范围查询时,B树依然需要通过从根节点到叶子节点的一遍遍遍历,来找到符合范围条件的数据。
  2. B+树范围数据查找过程
    B+树由于所有数据都存放在叶子节点上,并且叶子节点存放数据还是有顺序的。所以在范围查询时,只需要遍历叶子节点,所以效率相比B树要高的多得多。
  3. 比较
    由于B+树的存储数据结构,在范围查询时只需要遍历有序的叶子节点,找到“头”和“尾”,中间的叶子节点就是我们要的范围数据。
    B+树>>B树,B+树大胜。

总结

作为Mysql的索引结构,一定是为了加快查询速度,通过不同情况下的查询分析,我们可以看出B+树是要比B树更适合的,所以Mysql也就选用了B+树作为索引的结构。
在说点闲话吧,最近跟朋友想做一个网站,现在前提条件准备都有了,但是现在很想通过seo把网站排名到百度搜索前面,但是很懵哈哈哈,有没有比较擅长这面的大佬交流交流啊啊啊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章