mysql 基础知识(1)MySQL ,Innodb, B tree,B+ tree

这个系列是我在观看 B 站一位大佬的讲解后做的笔记
希望我的笔记能让你们更加容易搞懂吧

本文包含内容:

  1. B 树和B+树的区别是什么?
  2. 什么是索引?(描述的很简单,后面会详细聊一聊索引)
  3. MySQL Innodb为什么使用的是 B+ 树结构呢?
  4. 为什么MySQL Innodb 会”自作主张“ 一个自增主键呢?

正文开始

1.B 树和B+树的区别是什么?

工具 :
https://www.cs.usfca.edu/~galles/visualization/BTree.html (B树)
https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html (B+树)
~
首先我们看下 B 树的存储结构:
B 树
接下来我们再看下 B+ 树的存储结构
B+ 树
此时我们发现其中显著的特点:
B+ 树 在叶子节点上是存在指针的,B 树是不存在指针的(最底层存在的箭头表示指针),
其次呢我们发现 B+ 树 会在叶子节点上冗余一份根节点的数据
~
总结一下:
B+树中只有叶子节点会带有指向记录的指针(ROWID),而B树则所有节点都带有,在内部节点出现的索引项不会再出现在叶子节点中,
B+树中所有叶子节点都是通过指针连接在一起,而B树不会
~
查阅过一些资料,说法也是有点让我看不太懂,感觉上说的是:
B 树 查询数据时命中率比较快,
B+ 树由于指针的连接,所以检索范围会更强。
~
提一嘴的是,MySQL 官网上关于这个Innodb 的 b+ 树 的指针连接是双向的,就是说 A -> B 的同时 B -> A

2. 什么是索引?

这里我们先简单的理解下什么是索引,后面我应该会详细聊一聊索引的分类等
索引 简单点说就是 帮助MySQL 高效的获取数据的一种数据结构.
就好比一本书,我想知道某一个章节在这本书的什么位置,索引就

3. MySQL Innodb为什么使用的是 B+ 树结构呢?

(这里千万记住:MySQL 和 B+ 树没有直接关系,是MySQL 下的 Innodb 存储引擎采用的 B+ 树 结构在存储和提取数据)
~
(Innodb 的存储过程我还不是很理解,所以我这边不做过多解释了,想了解的话可以自行谷歌一下)

~
Innodb 存储引擎 会将 数据以及索引都存储在磁盘中,存储结构就是 B+ 树。为什么不是B 树呢?
这是因为 B 树的结构中,非叶子节点也可以存储数据,就导致节点 ”变重“,而B+树中,非叶子节点是不存储数据的,用来充当 ”目录“ 的概念就很适合
(个人理解下来就是:Innodb 的工作流程是将 索引 以及 数据 经行分开存储,既然有索引,所以 B 树 的特点就不满足,还是B+ 树比较合适)

4. 为什么MySQL Innodb 会“自作主张” 一个自增主键呢?

简单的理解一下:
Innodb 中有一种分页存储的概念,一个页,或者说 一个page 中存储一定量的用户数据
画一张图简单的理解一下吧:
img1
~
首先我们需要知道:mysql 中的数据都是按顺序保存在 B+ 树叶子节点上的(所以说索引本身是有序的)
主要目的在于 :1.提高范围查询效率;2.增加排序效率;3.提高扫表能力,顺序访问。
~
其次:mysql 在底层又是以数据页为单位来存储数据的,一个数据页大小默认为 16k,当然你也可以自定义大小,也就是说如果一个数据页存满了,mysql 就会去申请一个新的数据页来存储数据。

  • 如果主键为自增 id 的话,mysql 在写满一个数据页的时候,直接申请另一个新数据页接着写就可以了。
  • 如果主键是非自增 id,为了确保索引有序,mysql 就需要将每次插入的数据都放到合适的位置上。(这种操作是需要耗时的)

当往一个快满或已满的数据页中插入数据时,新插入的数据会将数据页写满,mysql 就需要申请新的数据页,并且把上个数据页中的部分数据挪到新的数据页上。这就造成了页分裂,这个大量移动数据的过程是会严重影响插入效率的。
(如果没有理解的话,在用Innodb 作为搜索引擎的时候还是乖乖的加上自增主键id 吧!!!至于id 和 索引的关系我会放在以后的索引的文章中来解释)

一张图总结一下

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值