MySQL索引数据结构

1.了解Mysql的索引底层存储结构
索引是什么?索引是帮助mysql高效获取数据的排好序的数据结构。
索引使用的数据结构有哪些和mysql具体使用的数据结构是什么样的?
数据结构知识复习:
mysql中支持的索引数据结构有二叉树,红黑树,hash表,B-Tree,接下来让我们依次了解一下。
二叉树数据结构是表示存储一组数据时,按照左边比右边大的结构存储,假如说我们有一组数据,如[23,45,12,33,11,15,66,85,87,34,99,44,38] ,二叉树是一种二分查找树,有很好的查找性能,
当我们去查找15的时候,我们可以通过2次查找就可以找到目标数据。
但是当N的数量足够大的时候,二叉树的高度就会变得非常高,如上组数据中的[23,45,66,85,87,99]这一组数据,我们查找99时,
  • 我们会查找4次,然后整个查找过程,像是链表.我们换一组数据,[1,2,3,4,5,6],这样会更加直观。所以我们想象一下,假如有1000个依次增大的数据的时候,二叉树应该有1000层高,我们查找起来也并不轻松,那就和单向链表一样了。
0
 
因此,我们很多的前辈就优化了二叉树,于是就产生了平衡二叉树。平衡二叉树是带有平衡因子的二叉树,也就是在二叉树的基础之上,添加了自带的平衡算法,用以解决二叉树数据结构下,退化成链表的情况。如[1,2,3,4,5],平衡二叉树就会变成以下的情况。平衡二叉树的特点是:每个节点最多只有两个子节点;每个节点的值比他的左子树的所有节点大,比他右子树的所有结点小(有序);每个节点的左子树的高度与右子树的高度之差绝对值不超过1。最后一条规则,我们通过一开始提供的数组,来展示一下[23,45,12,33,11,15,66,85,87,34,99]。
 
0
 
再来看一下红黑树。红黑树是另一种演变过来的二叉树,也是为了解决二叉树极端情况下退变成链表的问题而产生的,它比平衡二叉树的规则更加严格,但是红黑树的查找性能比平衡二叉树要好。
红黑树的规则:1.每个节点都有颜色,红色或者黑色。
2.根节点是黑色。3.红色节点的父节点和叶子节点不能为红色。4.所有为null叶子节点都是黑色(空节点视为叶子节点NIL)5.每个节点到叶子节点的每个路径黑色节点的个数相等。
平衡规则:1.变色 2.旋转
再看一下上一组数据,在红黑树中是什么样子[23,45,12,33,11,15,66,85,87,34,99,44,38]
0
不管是平衡二叉树和红黑树,都有一个问题,就是如果再继续增加数据,树的高度就会一直上涨,假如添加1000个数据,那树的高度起码得超过100层,这对于索引查找来说,也是性能较差的一种选择。
B树是多叉树又叫多路查找树,它可以保证树的高度不会太高。B树的阶,也就是“多路查找树”中的路,它就会在我们限定的范围内,进行一个树的构建。
B树规则:1.所有的关键字都是按照递增的顺序排列,遵循左小右大的原则。2. 1<非叶子节点的子节点数<=M(阶数),空树除外 3.关键字数量是M-1个,在B树的节点上 可以存放多个数值,数量与其阶数相关。
4.所有的叶子节点均在同一层,叶子节点除了包含关键字和关键字指针外也有指向其子节点的指针,不过叶子节点没有子节点,所以指针为空。
还是看这个数值的示例[23,45,12,33,11,15,66,85,87,34,99,44,38],下图是一个阶数为4的B树。其关键字最多可以有3个,通过下图与上图红黑树和平衡二叉树比较可以看出,其高度不高。
0
通过新加入很多数据,才能填满根节点有3个关键字。这证明了,同样的高度下,B树可以存储更多的数据。
0
但是目前mysql索引使用最多的还是B+树,那么B+树又是什么呢?
B+树是B树的变种,B+树在B树的基础上在叶子节点添加了双向指针,也就是说B+树的所有的叶子节点之间都指针指向下一个叶子节点。而在非叶子节点中,B树中存储了相应的数据,B+树中存储的是该分支的所有索引字段,这样搜索时,B树是在非叶子节点有可能命中结果,B+树的命中,只能在叶子节点,这一点的设计使B+树的搜索性能比B树要更加稳定。叶子节点之间存在指针,形成了一种链表,更有利于数据库进行全表扫描。
0
 
在B+树中,所有节点都在叶子节点中冗余存在,如下图显示。
0
hash表是什么呢?
hash表是一种散列存储结构,通过一种hash计算(散列算法)就可以定位出数据存储的位置。hash的数据结构是一种数组加链表的形式。存储数据时,将数据进行hash计算,获得一个hash地址,然后进行比较存储。
使用hash表存储结构存储索引的话它的优势是可以仅通过一次hash运算就能够计算出数据存储的位置,所以某些特定的查询时,hash表要比B+树的效率要高。但是hash表存储有它的缺陷,最经典的就是hash冲突问题。当有多个数据都指向hash数组位置,该位置还存储了一个链表,可以存储多个索引,在进行查询时,还需要遍历整个链表来定位要查询的数据。还有进行范围查询时,hash表也不适用。因为hash存储的索引不是有序的,当进行范围查询时,在hash表无法更快的排序并指定范围,这必将经过复杂的运算,复杂的运算过程就会耗费一定的时间。
 
0
综合这几种数据结构的特征,最终mysql底层默认选择了B+树来存储索引。B+树是天然有序的,且叶子节点之间存在指针,它的搜索性能远远大于B树。
posted @ 2023-05-05 10:52  行业小白  阅读(46)  评论(0)    收藏  举报