一位去阿里面试的小伙伴,在第一面就挂了。他跟我说是被数据库里面的几个问题难倒了,他说面试官问了事务隔离级别、MVCC、聚集索引/非聚集索引、B 树、B 树这些,都没回答好。
大厂面试基本上是这样,由点到面去展开,如果你对这个技术理解不够全面,很容易就会被看出来。关于事务隔离级别、MVCC、B树、B 树在往期视频中我都有讲解过。那今天,我给大家来聊一聊聚集索引和非聚集索引。
另外,我花了很长时间,准备了一份500页的PDF面试资料文档和一份10W字的Java总结面试题和答案,
简单来说,聚集索引就是基于主键创建的索引,除了主键索引以外的其他索引,称为非聚集索引,也叫做二级索引。
由于在 InnoDB 引擎里面,一张表的数据对应的物理文件本身就是按照 B 树来组织的一种索引结构,而聚集索引就是按照每张表的主键来构建一颗 B 树,然后叶子节点里面存储了这个表的每一行数据记录。所以基于 InnoDB 这样的特性,聚集索引并不仅仅是一种索引类型,还代表着一种数据的存储方式。
ENTER TITLE
同时也意味着每个表里面必须要有一个主键,如果没有主键,InnoDB 会默认选择或者添加一个隐藏列作为主键索引来存储这个表的数据行。一般情况是建议使用自增 ID 作为主键,这样的话 ID 本身具有连续性,使得对应的数据也会按照顺序存储在磁盘上,写入性能和检索性能都很高。否则,如果使用 UUID 这种随机 ID,那么在频繁插入数据的时候,就会导致随机磁盘 IO,从而导致性能较低。需要注意的是,InnoDB 里面只能存在一个聚集索引,原因很简单,如果存在多个聚集索引,那么意味着这个表里面的数据存在多个副本,造成磁盘空间的浪费,以及数据维护的困难。
由于在 InnoDB 里面,主键索引表示的是一种数据存储结构,所以如果是基于非聚集索引来查询一条完整的记录,最终还是需要访问主键索引来检索。
这个问题要回答好,还真不容易。涉及到 MySQL里面索引的实现原理。但是如果回答好了,就能够很好的反馈求职者的技术功底,那通过面试就比较容易了。
最后,我把之前分享的资料全部整理成了文字,希望能够以此来提高各位粉丝的通过率。
我是被编程耽误的文艺Tom,只弹干货不掺水!你们的支持就是我最大的动力!关注我,面试不再难!