数据库面试资料

本文详细探讨了MySQL数据库中的索引原理,包括索引的作用、数据结构、InnoDB为何选择B+树、索引失效的原因、ID递增与UUID的优劣、聚集与稀疏索引的区别,以及主键索引的重要性。还讲解了最左匹配原则和覆盖索引的概念,旨在帮助读者理解并优化数据库查询性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 什么是索引

(空间换时间)
索引是帮助mysql高效获取数据的数据结构
在mysql中,数据最终存储在硬盘中,(如果i/o操作不够多,查询就很慢)

2. 索引引用哪种数据结构:

(InnoDB不能手动创建hash,系统判断hash是否能起到加速效果,自适应创建。PS:可以关闭自适应)
Hash
B±tree

3. 为什么InnoDB使用B+_tree

二叉搜索树:可能存在顺序结构(链表树),存在遍历查找的结果,空间时间都浪费了
平衡二叉搜索树(AVL):实质是平衡二叉树,每个父节点只能有两个子节点,这就导致数据很多的时候树的深度太深,也就是查询的时候I/O操作多,倒是查询速度变慢,同时mysql每次从磁盘读取数据到内存默认是16KB,而对于搜索来说有用的数据只有一点点,导致读写资源浪费,即是节点只有一个关键字,每次I/O操作获取目标数据太少
B_tree:多路搜索树,绝对平衡,节点在同一水平线,每个节点关键字有N个,将数据分成若干开区间,节点内容包括(子节点索引和数据)

B+_tree:优点:1.、基于索引的扫表操作;2、叶子节点天然有序,基于索引排序更加优秀;3、每次I/O操作读取的索引更多,吞吐能力更强。
缺点:每次访问数据,必然要访问叶子节点。

4. Mysql索引失效的原理,

B±tree:联合索引(a,b)遵循当a有序且相等的时候,b也是有序的,遵循最佳左前缀原则的语句,可以判断联合索引,而只有单值匹配的话只能全盘匹配,

5. 为什么B+_tree建议ID递增,为什么不用uuid

递增ID插入数据的时候是尾插数据,而uuid随机数插入可能设中间插入,效率低,同时uuid数据长度比较长,每次IO读取量比较少。

6. 聚集索引

只有主键索引是聚集索引,其他都是非聚集索引

7. 稀疏索引

MyISAM引擎:不管是主键索引、唯一索引或者普通索引,其索引都属于稀疏索引,通过索引找到存储数据的myd的地址,在通过地址读取myd中的数据
InnoDB引擎:非主键索引(稀疏索引)存储相关键位和它对应的主键值,包含两次查找,在非主键索引中找到主键索引的ID,在通过ID在主键索引中找到数据
PS:如果InnoDB非主键索引直接存储数据的话,存在一致性问题(每次维护需要维护所有索引)和空间浪费的问题

8. 为什么InnoDB要求一定要建立主键索引?

  1. 如果不建立主键索引,系统会自动生成主键索引——隐藏主键,这个时候占用空间是 int(6byte),而主动建立主键索引只需要int(4byte)
  2. 处理事务的时候,主键索引使用的是行锁,隐藏主键索引使用的是表锁

9. 最左匹配原则:

当使用联合索引的时候,以最左边的键创建B+_tree,然后从左边开始进行匹配,“索引列上少计算,范围之后全失效”,离散型极差之后,最后一个索引就可能用不上了

10. 覆盖所引:

通过索引项的信息可以直接返回所查询的列,则该索引成为查询sql的覆盖所引,不用产生回表操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值