Mysql的索引以及底层的数据结构(面试)

目录

无索引

有索引

索引底层的数据结构

其他数据结构

二叉搜索树

红黑树

B树

B+树

回答:

什么是索引?

索引底层的数据结构?

B树与B+树的定义和区别


索引(index)是帮助Mysql高效获取数据的数据结构(有序)。在数组之外,数据库系统还维护着满足特定查找算法的数据结构(B+树),这些数据结构以某种引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

无索引

对于上面的图,我们如果想查到id7"灭绝"的年龄,没有索引的情况下,只能从id1开始逐个遍历查询,当我们查询到7时,查询也不会停止,会继续查询,遍历完整张表。效率较低

有索引

假如Mysql用二叉搜索树来维护表中的数据,查找效率会高很多。

索引底层的数据结构

其他数据结构

二叉搜索树

二叉搜索树在正常情况下的查找效率很高是O(log n)级别的,但是如果数据有序,它就会退化成链表,到达O(n)级别

红黑树

红黑树虽然没有二叉搜索树的会失衡的缺点,但是因为其仍然是二叉树,当数据量很大的时候,红黑树会非常的高,查找数据也要查询很多次。

B树

B树是一种多岔路衡查找树,相对于二叉树,B树的每个节点可以有多个分支,一颗最大度数为5的B树,每个节点可以存储4个key,它比较矮胖,查找层级就比较短,效率就更高

B+树

B+树是在B树基础上的一个优化,使其跟适合实现外存储索引结构,InnoDB存储引擎就是使用B+树来实现其索引结构的

相对B树的优点:

1.**磁盘读写代价比B树更低:**非叶子节点只存储指针,不存储任何数据,叶子节点才会存储数据,B树在查询的过程中,需要加载路径上的节点的数据才能够定位到目标数据的位置;B+树的非叶子节点存储的是方便找到目标叶子节点的指针,效率高很多。

2.**查询效率B+树更稳定:**B树有可能在非叶子节点上找到目标数据;而B+树每次都要到叶子节点查找数据,更加稳定。

3.**便于扫库和区间查询:**B+树的叶子之间有双向指针,在进行范围查询的时候,不需要回到根节点重新查找数据,查找效率更高。

回答:

什么是索引?

索引是帮助Mysql高效率获取数据的数据结构;它提高了数据检索的效应,降低了数据库的IO成本;通过索引列对数据进行排序,降低数据排序的成本,降低了CPU消耗,因为我们在创建索引的时候就需要进行排序了。

索引底层的数据结构?

Mysql的InnoDB引擎采用的B+树的数据结构来存储索引

因为B+树的阶数更多,路径更短;相对于B树来说,B+树的磁盘读写代价更低,因为它的非叶子节点只存储指针,叶子阶点才存储数据;并且因为B+树的叶子节点之间有双向指针,B+树更方便扫库和区间查询,无需像B树一样返回根节点进行重复的查询。

B树与B+树的定义和区别

B树是一种平衡的多路搜索树,每个节点既存储键(key)也存储对应的数据(data),所有节点(包括内部节点和叶子节点)都能直接访问数据。

B+树是B树的变种,内部节点只存储键作为索引,不存储数据,所有数据都集中在叶子节点存储,并且叶子节点之间通过指针连接成有序链表。

核心区别

  • 数据存储位置:B树所有节点都存数据,B+树只有叶子节点存数据

  • 查询效率:B树可能在非叶子节点就找到数据(等值查询更快),B+树必须走到叶子节点才能找到数据(每次查询路径长度固定)

  • 范围查询:B树需要中序遍历,效率低;B+树通过叶子节点的链表可以直接顺序遍历,效率极高

  • 空间利用:B+树内部节点只存索引,能容纳更多键,树更矮,减少IO次数

  • 冗余性:B+树键会冗余出现在内部节点和叶子节点,保证叶子节点包含所有键

相关推荐
A10169330711 小时前
Nginx与frp结合实现局域网和公网的双重https服务
数据库·nginx·https
happymaker06262 小时前
JDBC(MySQL)——DAY03(Blob类型,批处理,连接池)
数据库·mysql
智者知已应修善业2 小时前
【不用第三变量交换2个数】2024-10-18
c语言·数据结构·c++·经验分享·笔记·算法
Dovis(誓平步青云)2 小时前
《MySQL查询进阶:复合逻辑与多表关联的实战心法》
数据库·mysql
XiaoHu02072 小时前
C/C++数据结构与算法(第三弹)
数据结构
June`2 小时前
mini-redis项目之Resp协议
数据库·redis
lhbian2 小时前
redis分页查询
数据库·redis·缓存
顶点多余2 小时前
Mysql 基本查询详解
数据库·mysql
X-⃢_⃢-X2 小时前
八、Redis之BigKey
数据库·redis·缓存