前言
相信大家面试的时候,有不少被面试官问到:
- 你了解MySQL的索引吗?
- MySQL底层的数据结构是什么?
- B+树与B树的区别?
- MySQL为什么使用B+树作为索引结构?
本篇文章将为你解答上述这些问题,让我们在面试的时候回答的游刃有余,并强化我们对MySQL的理解。
一、索引介绍
索引是一种用于快速查询和检索数据的数据结构。它类似我们于查字典,当查询不会的单词时,总是先通过目录去查找,而不是一页一页的去翻找。
索引底层数据结构有很多种,常见的有:B+树、B树、Hash和红黑树。本篇只针对B树和B+树展开阐述。
二、MySQL底层的数据结构
在MySQL中,无论是Innodb还是MyIsam存储引擎,都使用了B+树作为索引结构。那他与B树的区别是什么呢?
1.B树
1.1 B树概述:B树,这里的 B 代表 balance(平衡),全称为多路平衡二叉树。
我们知道普通的平衡二叉树的每个节点只能有 2 个子节点,不同的一点是B树允许每个节点有更多的子节点。下图是 B树的简化图:
如上图所示,相对于普通平衡二叉树,B树的每个节点可以有多个子节点,以此降低树的高度,因为树的高度越高,意味着磁盘 I/O 操作会更多。所以,B 树在数据查询中比平衡二叉树效率要高。
1.2 B树特点:
- B树的所有节点既存放键(key) 也存放数据(data)。
- B树的每个数据的关键字只出现在一个结点中(每个结点存储一条记录)
- B树的检索的过程相当于对范围内的每个节点的关键字做二分查找,可能还没有到达叶子节点,检索就结束了。
2.B+树
2.1B+树概述:B+ 树是 B 树的一种变体。MySQL 中索引的数据结构就是采用了 B+ 树,下图是B+树的简化图:
2.2 B+树特点:
也就是在B树的基础上:
- 叶子节点才会存放实际数据(索引+记录),非叶子节点只会存放索引
- 所有索引都会在叶子节点出现,叶子节点之间构成一个有序链表
三、MySQL中B树和B+树的区别
- B 树的所有节点既存放键(key) 也存放数据(data),而 B+树只有叶子节点存放 key 和 data,其它非叶子节点只存放 key。
- B 树的叶子节点没有任何联系。B+树的叶子节点用双向链表进行连接,既能向右遍历,也能向左遍历。
- B 树的检索的过程相当于对范围内的每个节点的关键字做二分查找,可能还没有到达叶子节点,检索就结束了。而 B+树的检索效率就很稳定,任何查找都是从根节点到叶子节点,叶子节点的顺序检索很明显。
- 在 B 树中进行范围查询时,首先找到要查找的下限,然后对 B 树进行中序遍历,直到找到查找的上限;而 B+树的范围查询,只需要对链表进行遍历即可。
四、MySQL为什么使用B+树作为索引结构?
综上可知,MySQL用B+树作为索引结构:因为数据基于磁盘存储,B+树与 B 树相比,B+ 树可以比 B 树更”矮胖“,具备更少的 IO 次数、更稳定的查询效率和更适于范围查询这些优势。
总结
以上就是MySQL中B树与B+树的区别,在面试中被问到可以先说明两者的特点,在进行对比区分。希望本篇文章对大家有所帮助,谢谢!