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

相关推荐
2603_965148116 小时前
如何解析JSON数据?API返回的商品信息处理教程
开发语言·数据库·python·自动化·json·api
ltl7 小时前
RocksDB 经典故障排查:L0、compaction 与 write stall
数据库
xfhuangfu8 小时前
Oracle中建立到CDB和PDB的连接
数据库·oracle·rpc
小小龙学IT8 小时前
DuckDB 深度实战:用 C++ 在进程内跑一个「分析型数据库」
数据库·c++
NineData8 小时前
DTCC 2026 预告|NineData CEO& 创始人叶正盛:面向 AI Agent 的数据库 DevOps 与数据复制实践
数据库·人工智能·数据库开发·devops·ninedata·数据库技术·dtcc
J_bean9 小时前
MySQL 事务是否必须手动开启?
数据库·mysql·数据库事务·自动提交·手动提交
J_bean9 小时前
MySQL InnoDB 如何检测死锁、判定死锁、处理死锁
数据库·mysql·死锁·死锁检测·处理死锁·死锁判定
浪子明X9 小时前
从 MongoDB 文档到关系模型:构建可重跑、可对账的数据迁移流水线
数据库·mongodb·oracle
杜子不疼.9 小时前
国产数据库撑起固井软件自主化:金仓 × 中海油服「海恒 Cemsol」落地解析
数据库
隔窗听雨眠9 小时前
GBase 8s并发控制深度解析:封锁机制、隔离级别与死锁处理全攻略
服务器·数据库·oracle