这个系列是我在观看 B 站一位大佬的讲解后做的笔记
希望我的笔记能让你们更加容易搞懂吧
本文包含内容:
- B 树和B+树的区别是什么?
- 什么是索引?(描述的很简单,后面会详细聊一聊索引)
- MySQL Innodb为什么使用的是 B+ 树结构呢?
- 为什么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+树中只有叶子节点会带有指向记录的指针(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 中存储一定量的用户数据
画一张图简单的理解一下吧:
~
首先我们需要知道:mysql 中的数据都是按顺序保存在 B+ 树叶子节点上的(所以说索引本身是有序的)
主要目的在于 :1.提高范围查询效率;2.增加排序效率;3.提高扫表能力,顺序访问。
~
其次:mysql 在底层又是以数据页为单位来存储数据的,一个数据页大小默认为 16k,当然你也可以自定义大小,也就是说如果一个数据页存满了,mysql 就会去申请一个新的数据页来存储数据。
- 如果主键为自增 id 的话,mysql 在写满一个数据页的时候,直接申请另一个新数据页接着写就可以了。
- 如果主键是非自增 id,为了确保索引有序,mysql 就需要将每次插入的数据都放到合适的位置上。(这种操作是需要耗时的)
当往一个快满或已满的数据页中插入数据时,新插入的数据会将数据页写满,mysql 就需要申请新的数据页,并且把上个数据页中的部分数据挪到新的数据页上。这就造成了页分裂,这个大量移动数据的过程是会严重影响插入效率的。
(如果没有理解的话,在用Innodb 作为搜索引擎的时候还是乖乖的加上自增主键id 吧!!!至于id 和 索引的关系我会放在以后的索引的文章中来解释)