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+树键会冗余出现在内部节点和叶子节点,保证叶子节点包含所有键

相关推荐
小白男神4 天前
MySQL进阶学习四(存储过程、游标、触发器)
mysql
这个DBA有点耶4 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G4 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备4 天前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
m0_547486664 天前
《数据结构教程》全套 PPT课件2026
数据结构
科创致远4 天前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
kybs19914 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net
2601_962218614 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法
程序猿_极客4 天前
【免费】分享一套优质的基于SSM的校园失物招领系统的设计与实现,源码+文档+视频详解(讲解)
java·mysql·ssm·课程设计·失物招领系统
张洛闻Eren4 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github