mysql索引为什么采用B+树结构

          mysql索引为什么采用B+树结构一个面试高频题,它能够很好的检验出面试者对mysql原理的理解深度,本文将从一下几个方面来分析:

            1.索引是什么,核心问题是什么?

            2.hash、二叉树、AVL、红黑树、B树、B+树的对比。

第一部分 索引是什么,核心问题是什么?

       索引的定义:索引是为了帮助数据库快速获取数据的数据结构,也就是索引本质上是一种数据结构,目的是为了加快数据的访问速度。

       核心问题:明白了索引目的是提高数据获取速度,是一种数据结构,那么更深一层的定位是,那些问题影响了数据的获取速度,这个很显然数据是存储在磁盘上的,磁盘数据要先加载到内存中,这个过程IO是最大的瓶颈,那么核心是解决IO的问题,也就是尽量减少IO此时,一次IO能获取更多的数据。

        从上边的分析我们可以看出,重点是设计出一个好的数据结构形式,来提高IO的效率,我们常见的数据结构有:二叉树、AVL、红黑树、B树、B+树,接下来我们比较下各种数据结构,自然就会明白为什么选择B+树。

第一部分:hash、二叉树、AVL、红黑树、B树、B+树的对比。

       在分析各种数据结构之前,我们先来说下磁盘的分块读取的几个概念:

局部性原理:

      时间局部性:一般情况下,刚刚访问过的数据会很快会被再次查询。

      空间局部性:数据和程序都有聚集成群的倾向,具备某一个特点的数据经常会聚集存储。

磁盘预读:读取数据到内存时,一般读取的是页的整数倍,页的大小是根据操作系统相关,默认是4k或者8K,在mysql的innodb存储引擎中,默认是16Kb.

 

hash、二叉树、AVL、红黑树、B树,B+树对比

1.hash结构:memory存储引擎支持hash索引,innodb存储引擎支持自适应hash(由mysql系统来决定使用的是hash索引还是B+树)

      数据结构:是通过数组和链表来实现的,

     1.hash结构的缺点:

     1) 必须要设计一个优秀的hash算法,保证数据足够的散列,如果存在大量的hash冲突或者hash碰撞,那么会导致某些查询效率非常低。

     2) 当需要进行范围查询时,需要对比每一个元素值。效率低。

     3) hash比较浪费内存空间,而内存时非常宝贵的资源,

2.二叉树, BST,AVL树,红黑树:

       这四中数据结构都是有序的,每一个节点有且只有两个分支,AVL树和红黑树保证左右两个分支的个数尽可能的相同,AVL树要求左右子树高度差不能大于1,也就是严格的平衡,红黑树是非严格平衡树。

这四种结构的缺点:

       每一个分支都是只有两个子节点,那么当数据增加时,树的高度会变深,会导致IO次数变多。

3.B树和B+树

     B树:主要在叶子节点和非叶子节点都存储索引和数据,

     B+树:叶子节点存储索是key和value(数据),叶子节点之间是双向指针,非叶子节点存放的是key。

我们以四阶的树来看下,数字1到10的B树和B+树的结构如下图:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5a-G5bqm5q-U5L6L,size_20,color_FFFFFF,t_70,g_se,x_16watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5a-G5bqm5q-U5L6L,size_20,color_FFFFFF,t_70,g_se,x_16

 

       从结构我们可以看出,B树所有节点都存储这key和value,数据是没有重复的,而B+树非叶子节点值存储key,而1到10都会存在叶子节点上。

   总结

通过上边分析我们可以看出,与B+树相比,hash结构查询效率和存储都相对差,二叉树, BST,AVL树,红黑树当数据比较大时会导致树的深度比较深,IO次数会增加,B树所有节点都存储key和数据,当数据量很大时单个分页加载的key值就会少,这样导致跟多的IO,B+树非叶子节点只存储key,那么每个分页能够加载更多的key值,减少了IO,同时B+树叶子节点是双向链表,所以B+树使得范围查询、范围查询、分组查询等更简单。

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

密度比例

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值