Skip to content

MySQL常见面试题——索引相关

更新: 5/9/2025 字数: 0 字 时长: 0 分钟

MySQL索引是问的比较多的问题了,很多面试官针对你的项目的一个常见的问题就是”你的数据库查询用了说明优化方式?“,这个时候第一个想到的就是索引吧

那我们就来聊一下索引这个东西

索引是什么

很喜欢MySQL45讲中的一句话:”一旦问到你索引是什么,你一定要说出来是一种可以提高查询速度的数据结构“

目前MySQL InnoDB的索引基于的是B+Tree,相对于BTree有着更少的IO次数,更稳定的效率等好处

B+Tree的非叶子节点是不会存放实际的记录数据,仅存放索引,因此会更加”矮胖“

什么是聚簇索引

在InnoDB中就是主键索引

什么是覆盖索引

就是索引拉满了,所有字段都是索引,这个时候索引层面就可以完成一次查询,减少了IO操作,效率高了,维护成本也高了

索引一定能提高查询速度嘛?

答案是否定的,如果学过数据结构的小伙伴应该清楚,B+Tree的优化方式是按照索引的值进行的有序排列,如果进行左关键字进行查询的话就会出现无法确定索引值的情况

其次对于联合索引还会有最左原则 ,也就是针对(a,b,c)这种索引,只有a b c的顺序进行匹配(可以没有,但顺序一定要对),不然也会无法命中索引

什么时候需要建立索引

当一个字段经常需要被作为查询条件

什么时候索引适合当主键

字段需要具有唯一性,且最好是递增的字段,分布式系统使用分布式id方案(Snowflake/leaf)

为什么推荐使用递增Id作为主键

InnoDB的索引在设计的时候使用了B+Tree,由于其特性,为了方便插入自然更加希望是递增的

非递增的Id会造成更多的也分裂,也就是由于Id可能插入随机的页,因此页分裂可以发生在任何的地方,照成更多的数据移位

索引是不是越多越好?

维护索引需要一定的开销,因此并非越多越好,且索引自身也会占据一定的空间,而且索引优化的是查询,实际上会对增改删操作照成影响

本站访客数 人次      本站总访问量