MySql索引,B+树是什么?

索引的原理是什么?

 

1.本质就是一种排好序的数据结构 类似字典中的目录结构。

索引常见的数据结构

1.常见的索引数据结构是树结构。

  • 例如二叉树:一、时间复杂度O(n) 二、度不超过2 左子节点小于本节点,右子节点大于本节点。 
  • 又例如平衡二叉树:根节点会随着数据的改变而改变,数据量越多,IO次数就越多,就越慢。

2.B树 (二三树)

  • 这是B树的基本结构;可以看到每个节点中不仅包含数据的key值,还有data值。
  • 而每页数据有限,如果data比较大,会导致每个节点key存储的较少,当数据量较大时,同样也会导致B树很深,增加磁盘io次数,进而影响查询效率。

Mysql的B+树

B+树是Mysql常用的索引数据结构。有以下特点:

  1. 所有数据节点都是按照键值大小放在同一层叶子结点上,非叶子节点只存存储key的信息。这样大大减少每个节点的存储的key的数量。降低B+树的高度。
  2. B+ 树叶子节点的关键字从小到大有序排列,左边结尾数据都会保存右边节点开始数据的指针
  3. B+ 树的层级更少:相较于 B 树 B+ 每个非叶子节点存储的关键字数更多,树的层级更少所以查询数据更快
  4. B+ 树查询速度更稳定:B+ 所有关键字数据地址都存在叶子节点上,所以每次查找的次数都相同所以查询速度要比B树更稳定;
  5. B+ 树天然具备排序功能:B+ 树所有的叶子节点数据构成了一个有序链表,在查询大小区间的数据时候更方便,数据紧密性很高,缓存的命中率也会比B树高。
  6. B+ 树全节点遍历更快:B+ 树遍历整棵树只需要遍历所有的叶子节点即可,,而不需要像 B 树一样需要对每一层进行遍历,这有利于数据库做全表扫描。

B+树的结构:

这是啥玩意?

  • 数据页就是存放数据页的物理地方,且数据页之间是通过双向链表连接,
  • 拿出一部分来看:

  • 必备知识:Mysql存储数据以数据页为最小单位,且数据在数据页中的存储是连续的,数据页中的数据是按照主键排序的,数据页之间通过单向链表关联。
  • 主键目录哪来的?:在每个数据页中,必然有一个最小主键,然后每个数据页最小的主键和页号会组成一个主键目录。
  • 当我们查询某个主键的数据时,先在主键目录里查询其所在的数据页,再到数据页去查询主键记录对应的值。
  • 当数据海量时,主键目录也很庞大了,查询效率也不高。所以我们引入了一个新概念:索引页
  • 当主键目录很多,很庞大时,用索引页,将主键目录拆开到不同索引页中。例如:
  •  索引页中记录的是每页数据页的页号和该数据页中最小的主键的记录,也就是说最小主键和数据页号不是单纯的维护在主键目录中了,而是演变成了索引页,索引页和数据页类似,一张不够存就分裂到下一张。
  • 当我要查询id为20的索引应该怎么查?应该去查哪个索引页呢?
  • 所以又在此基础上引入了索引页
  • 所以查询某个数据页的具体主键值的时候,先去找到对应索引页的索引页 再查询到数据页,再查询到具体数据
  • 那么你会发现,这种索引表记录其他索引表再记录其他索引表的索引这样的结构是可以嵌套的。实际上这就是一颗 B+ 树的结构这也是数据存到磁盘的真实数据结构 ;数据页中的数据用双向链表连接。
  • B+树的特性是什么呢?B+树,也是二叉搜索树的一种,但是他的数据仅仅存储在叶子节点(在这里就是数据页),像这种索引页+数据页组成的组成的B+树就是聚簇索引(这句话很重要)。
  • 聚簇索引就是Mysql基于主键索引结构创建的
  • 既然这里强调的是主键索引,那我们平时开发中除了主键索引其他的索引也用的不少,这时候该怎么办?假设你现在对nameage建立索引。现在回顾下主键索引,是不是在插入数据的时候基于主键的顺序去维护一个 B+ 树的?
  • 而实际上非主键索引其原理是一样的,MySQL 都是去维护一颗 B+ 树,说白了,你建立多少个索引,MySQL 就会帮你维护多少的B+树(这下是不是也突然想明白了为什么索引不能建立太多了?以前就知道不能建立太多索引,因为索引也会占用空间,实际上这就是根本原因)

  • 对于非主键索引(一般都是联合索引),在维护 B+ 树的时候,会根据联合索引的字段依次去判断,假设联合索引为:name + address + age,那么 MySQL 在维护该索引的 B+ 树的时候,首先会根据 name 进行排序,name 相同的话会根据第二个 address 排序,如果 address 也一样,那么就会根据 age 去排序,如果 age 也一样,那么就会根据主键字段值去排序,且对于非主键索引,MySQL 在维护 B+ 树的时候,仅仅是维护索引字段和主键字段。


  •  

    感谢作者,让我备受启发,醍醐灌顶
    作者:HollisChuang
    链接:https://juejin.cn/post/6931901822231642125
     

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值