MySQL B+Tree索引机制

时间:2020-07-03 00:31:51   收藏:0   阅读:156

写在前面:今天来学习一下MySQL中的索引机制。

一、何为索引?

说到索引,第一反应就是它能够加快数据查询的效率,可它到底是个什么东西呢?

数据库的索引是一种为了加速数据表中行记录检索的数据结构

索引的本质是 数据结构

我们来看一下索引的工作机制

技术分享图片

可以看到,我对ID创建了一个索引,形成了数据结构,当我要搜索ID的时候会调用我们的ID索引,直接在数据结构中扫描,找到ID对应的磁盘地址,然后快速定位,返回数据。
当然了这边的这条SQL语句很显然是全表扫描,因为是SELECT *

二、MySQL中的索引机制

我们打开navicat,到建立索引界面,

技术分享图片

可以看到MySQL存在两种索引机制,Hash和BTREE

Hash索引

以底层数据结构为hashtable的索引结构。
我们在Hash表中进行数据的录入或者删除时,通用步骤:

  1. 基于数据的key进行hashcode计算,得到int类型的数值.
  2. 基于hash int值与hash表的length进行计算得到下标位置.
  3. 基于数组的下标进行数据查找,若查找的下标位存在元素,再判断该存储元素的数据结构.
  4. 如果存储元素是链表结构则顺序递归比对.
  5. 如果存储元素是红黑树则递归二分查找.
  6. 索引的底层数据结构为Hash表结构的话,我们在等值的匹配过程中只需要进行基于数组的下标查找。时间复杂度为O(1)。但是我们也发现在存储元素进行hashcode计算之后,原本可比较大小的多个元素可能得到的hash int值确并不满足原本比较需求.

索引表索引的特点:

B-Tree

要讲B-Tree,就得先讲讲二叉树了

2.2.1二叉树

技术分享图片
二叉树的每个节点都存储了关键字和数据,每一次查找都是从根节点开始,向下进行递归查找。但是我们发现二叉查找树结构存在数据的倾斜(不规则)性,同时由于其复杂度为O(logN),很显然在大量数据的查找时会耗费很多时间,所以便要对二叉树进行改进,于是有了平衡二叉树。

试想一下,若我针对表中ID字段建立了自增序列,然后选用二叉树作为索引的底层数据结构。
技术分享图片
这个时候针对ID的二叉树结构将变为线性链表结构,如果我们再去查找的话就相当于全表扫描,效率很低。究其原因就是因为二叉树的高度太高了,导致查找效率不稳定。

2.2.2平衡二叉树(AVL)

这里推荐一个网页,点击此链接跳转,在其中选择比如B+Tree,然后自己添加节点,可以直观看到这棵树是怎样构成的。

AVL树是最先发明的自平衡二叉查找树,在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树.

ALV树维基百科中有这样的描述:

节点的平衡因子是它的左子树的高度减去它的右子树的高度(有时相反)。带有平衡因子1、0或 -1的节点被认为是平衡的。带有平衡因子 -2或2的节点被认为是不平衡的,并需要重新平衡这个树。

也就是说如果这棵树子树的高度差小于等于1的时候是平衡二叉树,如果大于1则不平衡,需要通过旋转操作对这棵树进行平衡。

技术分享图片
虽然平衡二叉树解决了二叉树查询不稳定的问题,但是平衡二叉树仍然存在一些问题
比如:

2.2.3多路平衡查找树(B-Tree)

B-树又叫多路平衡查找树,是一种绝对平衡的树形结构.它的绝对平衡指的是所有的叶子节点数据都同一个水平线上.

技术分享图片

同样我们可以通过之前的网站进行模拟,通过模拟我们发现,数据在进行插入或是删除的
过程中会基于节点个数的变化进行节点的合并和分裂.以达到树的绝对平衡.

总结:B-树的优势

2.3加强版的多路平衡查找树(B+Tree)

技术分享图片

总结

B+Tree相较于B-Tree的优势:

PS:本博文仅作为学习交流使用。

原文:https://www.cnblogs.com/jshmztl/p/13204405.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!