您的位置:首页 > 数据库 > MySQL

MySql数据库索引的选择B+的过程

2020-08-28 19:55 225 查看

MySql数据库索引的选择B+的过程

索引的本质:

  • 数据库索引是一种为了加速数据表中行记录检索的数据结构,且是一种分散存储的结构,而且这种数据结果是存储在我们的磁盘当中,所以我们对数据库的一个本质就是数据结构。

索引的工作机制:

  • 我们都知道索引是加速数据行的一个检索,可以提示这样的一个查询性能,这是怎么做到的呢,这里有一张表,假设有很多数据,每一条数据都会存储在我们的一个磁盘中,每个数据都会有对应的磁盘地址,如果我们就单纯的给数据库发起一条查询语句select * from t_user where id =102; 按照常规的做法,拿到id=102根数据库id全部比较判断,这种做法就是典型的全文扫描过程。
  • 全文扫描存在一个问题,如果数据较少时倒是没有什么差距,但是当我们数据过大时你就会发现ON的时间查找效率就会很低,所以我们的索引就可以出场, 前面我们就说明了索引就是一种数据结构,我们就可以对user的id列分出来建立一个数据结构跟我们的磁盘d地址进行一个映射保存在一个数据结构当中,当我们查询的时候直接到数据结构当中比对,当找到对应的id时通过对应的磁盘地址指针快速的找到磁盘的位置对应的数据返回给客户端。这就是我们的索引所在。
  • 根据上面的描述,肯定存在很多问题,索引应该采用那种数据结构类型,数据结构又分为8种数据结构,那些数据结构可以符合索引的存在呢。
在建立索引的同时我们可以看到有两种方式,第一种是BTREE,第二种是HASH,所以在我们的Mysql当中存在这两种。我们简单说一下HASH表结构

  • 我们先大概了解一下HASH表底层数据结果是怎样得,HASH的第一维度的是一个数组,在数组当中每一个元素它是以不同的形式来展现,学过hashMap的源码的肯定都知道每个一个node都有不同的实现,比如node1是一个链表的结果,TREEnode1 是一个红黑树的结构,在这里就简单讲解一下HashMap的一些特征。
  1. HashMap初始数组默认容量为16,每次以二进制向左移动一位添加,元素超过数组长度的0.75便开始扩大。1.7版本采用选判断并且产生hash冲突才扩容,1.8版本先添加元素后判断阈值。
  2. 1.7版本采用头插法在多线程环境下会形成环形链表死循环,1.8版本后采用尾插法在多线程环境下会有数据丢失的问题
  3. 当链表达到8个数据时,会默认自动变成红黑树,如果数据降低到6个时会自动变回原来的链表形式,为什么不是数据达到7呢,假设我数据达到7时就默认转换成链表,就会可能出现7和8之间过多的转换。但如果数据是6时中间就存在一个缓冲数据不会照成多次转换浪费性能。
特点是:它的等值匹配是非常快,但是存在不支持范围查找这个问题,离散值查询快。

假设是索引底层采用的是二叉树的情况下。

  • 二叉树:(左小右大)通过关键字一分为二

  • 简单说就是从根节点左边是小于25包括负无穷小,从根右边就是大于25无穷大来区分,以递归的二分查询法查找,它查询的效率是Olog(N)。基于二叉树查找确实可以达到查询效率的提升,但是为什么mysql底层没有采用二叉树呢,简单说mysql底层主键索引都是以递增的形式增加只会导致二叉树形成线性表,画的有点丑。

  • 我们都是以自增主键的形式增加,树只会越来越高,和原来的全文扫描没有区别。

AVL树(平衡二叉树)

  • 平衡二叉树的定义是一个节点的子节点高度差不能超过绝对值1,比如20的节点左边是一个子节点,那么它右边的子节点绝对不能大于1,要么右边也是一个子节点要么就没有。所以它没有违反平衡二叉树的原则,虽然它右边没有数但是它也是符合平衡二叉树的原则。

  • 平衡二叉树和二叉树的不同点就是,平衡二叉树会自动旋转为何这棵树的平衡,在我们的数据的增删当中都会自动的调整达到满足平衡型,但是AVL树还是存在一些问题,比如说它还是不支持范围的查询。最主要的两方面:

  1. 平衡二叉树始终都是二叉树,导致树形太高查找次数过多。简单的7个数都有三层。
  2. 由于数据存在磁盘当中,二叉树和AVL树的结构是不适合来作为硬盘索引的数据结构。因为他们的空间占用率比较大。

B树结构

  • B树简称多路查找树,什么是多路,假设二叉树是二路的话,B树就是比二路还多的路。平衡的意思就是它的末尾节点都在一个水平线上,它是一棵绝对平衡的树。
  • 简单说这颗B树就只有五种区域,比如根节点的两个数的情况下有这五种可能性(1)小于20。(2)等于20。(3)大于20小于45(4)等于45(5)大于45 。当我们查询条件过来的时候就会根据根节点上第一个数比较,比如比20还小的话它就会走P1的路,如果大于20小于45的话就走P2其他路比较省略,其实它和二叉树还是一样采用的是递归方式。
  • 假设节点上有三个关键字它就会有四个字节(关键字的个数=子节点岔路-1),B树相对于平衡二叉树的不同是,每个节点包含的关键字增多了,特别是在B树应用到数据库中的时候,数据库充分利用了磁盘块的原理(磁盘数据存储是采用块的形式存储的,每个块的大小为4K,每次IO进行数据读取时,同一个磁盘块的数据可以一次性读取出来)把节点大小限制和充分使用在磁盘快大小范围;把树的节点关键字增多后树的层级比原来的二叉树少了,减少数据查找的次数和复杂度。

B+树

mysql的B+树是mysql自定义的树。

  • (1)B+树的指叉路和原来的B树不同在于关键字和子叉路相等,B+tree是以左闭合比较的方式。
  • (2)根节点于子节点不保存数据区。所有的内存数据都保存在尾节点当中(前面的B树根子节点都会保存数据)
  • (3)末尾的节点区域于这些箭头形成双向链表结构。每一个所有的元素它都会形成一个双向链表,包括首尾也会形成一个双向链表结构。双向链表使我们的范围查找,排序效率更高。

为什么说B+树比B树更适合数据库索引?

  1. B+树是B树的Plus版本,更厉害
  2. IO的效率高于B树
  3. 基于索引的表扫描性能高于B树
  4. 排序能力更强于B树
  5. 基于索引的查询更趋于稳定

MySql采用的存储引擎MyISAM和InnoDB

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: