Mysql中索引的内部结构是怎样的

目录

用来查询的数据结构

B树与B+树

B+树的优势与特点


用来查询的数据结构

  Mysql中的索引类似于目录,能够提高查询的速度,会占用更多的空间,也可能会拖慢增删改的速度。创建主键约束,唯一约束,外键约束时,会自动创建对应列的索引。

  我们今天来讨论索引的底层的数据结构,这也是面试中高频考察的问题。

  索引,一定是引入了一些额外的数据结构,来增加查询的速度。默认的情况下,进行条件查询操作,就是遍历表,一条一条数据都带入条件。引入索引,就是要通过其他的数据结构,加快查询的速度,减少遍历表的可能性。

  那么有哪些数据结构,能够加快查询速度?最快的我们可以想到红黑树哈希表。但是这两种数据结构,都不适合给数据库使用。

  哈希表只能查询key相等的情况,无法进行【1~10】这样的范围查询。经过hash函数的映射,原来key之间的大小关系,不能反映到计算出来的hash值的大小关系,也无法决定下标的大小关系。

  红黑树可以进行范围查询,但在红黑树中是通过中序遍历找到下一个后继元素,有时候就可能会往父节点上一系列回溯,才能找到后继。当元素非常多的时候,就会使树的高度变得比较高,查询的效率变低,高度每增加一层,比较次数就增加1.因此,红黑树也不适合大规模在硬盘上管理数据的场景。

B树与B+树

  因此就引入了B树,本质上是一个N叉搜索树。每个节点上可以存储多个元素,延伸出多个子树。表示同样数量的数据,需要的节点数就少了,对应的树高度也大大降低了。

上图每个方框是一个节点,每个数字代表一个key(或是一行数据库中的记录)

  表面上看拿着要查询的key在某个节点上比较的时候,需要更多的比较次数,但是这里的比较还是比较高效的。原因如下:

1)每个节点上的这些key也是有序排列的,比较的时候可以直接二分查找。

2)B树也会控制,某个节点上保存的key不会太多,如果插入更多的元素,使key变多了,就会使节点分裂出更多的子树出来。

3)多个数据,都是放在一块连续的存储空间上的,进行比较的时候,一次硬盘IO就能读出整个节点,就可以直接完成上述比较(进行多次比较,实际上只有一次硬盘IO

数据库索引数据结构的最终形态,是B+树,相当于B树的升级版。

B+树,同样也是N叉搜索树。

  按照上述规则来排列数据,此时叶子节点这一层,就包含了整个数据集合的全集。另外,B+树会把叶子节点通过类似于链表的链式结构串起来。此时就可以通过上述链式结构非常方便的遍历整个表中的所有数据,同时也非常方便进行范围查询。

针对索引列进行查询,就是从树根节点往下一层一层的查询。

针对非索引列查询,就是拿着最底下一层叶子节点,遍历链表就行了。

B+树的优势与特点

1)非常方便的进行遍历和范围查询。

2)当前任何一次查询操作,最终都是要落到叶子节点完成的。查询任何数据,经历的硬盘IO次数都是一样的,这个时候查询操作消耗的时间是稳定的。

3)由于叶子节点是数据的全集,对应的非叶子节点中都是重复出现的数据。就可以把表每一行的数据,最终都关联到叶子节点这一层。非叶子节点中只保存一个单纯的key即可(id)。

比如,使用id这一列来做索引。这里B+树的非叶子节点,都只需要保存一个id这样的值就行了。到了叶子节点这里,每个叶子节点不光要保存id,还要把后续的name,classId等信息也保存起来。

这样组织之后,非叶子节点占用的空间就比较小(非叶子节点只存id),此时,非叶子节点就可以缓存到内存中。

总结:(重点)·针对哪个列创建索引,就是针对哪个列构建B+树。

 ·主键索引的B+树,叶子节点是带有数据行的。

·其他的列的索引,叶子节点则是主键id

·针对非主键列进行索引查询,查到的结果是一个主键id

·还需要去主键索引中再做一次查询(称为“回表”)。

以上,关于B+树,希望对你有所帮助。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值