mysql8索引的数据结构_mysql索引底层数据结构与算法

---恢复内容开始---

索引是什么

索引是帮助MySql高效获取数据的排好序的数据结构

索引存储在文件里

索引结构

(二叉树、红黑树、BTREE、B+TREE、HASH)

二叉树

二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树组成。

二叉树存储方式:

以节点为基础,每新插入一个数据,则与父节点比较,若小于节点值则以节点为基础向左侧存储,反之向右,例如:

18c843d4d9527c4bc920f57fd3a6b43b.png

二叉树缺点:如果数据为有序递增,那么存入的数据结构为右侧连续,则该根节点只有右孩子,没有左子树,(称为斜树)从而失去二叉树本身的特性:

7cacd0c28df36a435b5aa73a1eb852a2.png

红黑树

红黑树针对二叉树的斜树做了一定优化,在二叉树的基础上,如果出现“斜树”的情况,则会自动均衡,均衡规则依旧按照二叉树特性(中间数值为节点,左侧子节点小,右侧子节点大):

e0658d923eb6b381d6e2f771c2be70b2.png

红黑树的自动均衡,会使索引的存储结构更加优化,从而保证数据查询的效率

注意:如果数据库表中存储的数据量过大,会导致红黑树的高度过高(不断往下扩展子节点),恰好要查询的目标数据在树结构的最低端,同样会比较消耗查询性能,

可以发现:如果尽量降低树的高度,则会更大的提升查询效率,BTREE则针对此特点进行了优化

BTREE(B树)

从红黑树得知:每一个节点只会保存一个索引,而BTREE将每个节点的内存进行扩容,从而使每个节点可以保存更多的索引,从而降低树的高度,提升查询效率:

05153aa7c1c7646904c88d2f9059ea1e.png

4bb4d084e3411a98419030f90dafbdc4.png

可以发现:相比红黑树,BTree的两层结构保存了更多的节点

BTree特点:

叶节点具有相同的深度

叶节点的指针为空

叶节点的数据key从左到右递增排列

如上图(右)可看到:BTree的每个节点会同时保存索引(key)和此索引对应的值(data)

so:如果可以减少每个索引的数据量,则减少每个索引的占用空间,从而在节点内存大小固定的情况下,每个节点可以保存更多的索引,会更进一步的降低树的高度(优化查询效率)

B+TREE(B+树)

B+Tree 相当于是BTree的变种,在BTree的基础上做了如下优化:

非叶子节点不存储data,只存储key,非叶子节点之间保存了指针,指向下一级,最终指向保存data的最底层叶子节点

叶子节点不存储指针

顺序访问指针,提高区间访问的性能(叶子节点的key从左到右依次递增,通过访问指针,如果遇到范围查询时可直接通过叶子节点的指针找到下一个索引,而不需要重新从根节点进行搜索)

9a49dc769f17ea13e1c9357971233031.png

3761f0f27b3083aa3fa0cce501c728eb.png

Hash

hash与树结构毫无关系,数据库如果使用hash的数据结构,则会将索引通过hash算法生成一个hash值保存在表中,并与此索引对应的文件指针直接对应,查询效率会很高

但是大部分数据库的索引结构都用B+Tree,原因是hash结构只是在等号查询的时候效率很高,如果是其他查询(比如范围查询,则没有B+Tree如此高的效率)

---恢复内容结束---

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值