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

相关推荐
运维行者_17 分钟前
企业无线网络监控的挑战与智能化演进趋势
大数据·运维·服务器·网络·数据库
国强_dev1 小时前
技术探讨:使用 stunnel 加密转发数据库连接时,如何获取客户端真实 IP?
数据库·网络协议·tcp/ip
@insist1231 小时前
系统规划与管理师-信息系统规划核心工作要点解析
数据库·软考·系统规划与管理师·软件水平考试·系统规划与管理工程师
超级数据查看器1 小时前
超级数据查看器 v10.0 发布
java·大数据·数据库·sqlite·安卓
数安3000天2 小时前
增量数据如何自动分类分级,避免目录“过期“?
大数据·数据库
南墙上的石头3 小时前
麒麟 V10 重装人大金仓 V8R6 踩坑实录(含 MySQL 兼容模式)
数据库·mysql
画中有画4 小时前
论向量数据库在项目中的应用
数据库
spider_xcxc4 小时前
Redis 数据库高质量实践指南(一)
运维·数据库·redis·oracle·云计算
l1t5 小时前
在linux和windows中解决duckdb 1.6dev版本输出执行计划报错问题
linux·运维·数据库·windows·duckdb
执子手 吹散苍茫茫烟波5 小时前
RC 隔离级别下 MySQL InnoDB 死锁典型案例
数据库·mysql