前言有位朋友去阿里面试,他说面试官给了几条查询SQL,问:需要执行几次树搜索操作?我朋友当时是有点懵的,后来冷静思考,才发现就是考索引的几个基础知识点~~ 本文我们分九个索引知识点,一起来探讨一下。如果有不正确的话,欢迎指出哈,一起学习~ 公众号:「捡田螺的小男孩」
一、面试官考点之索引是什么?
二、索引有哪些类型类型数据结构维度
物理存储维度
逻辑维度
三、面试官考点之为什么选择B+树作为索引结构可以从这几个维度去看这个问题,查询是否够快,效率是否稳定,存储数据多少,以及查找磁盘次数等等。为什么不是哈希结构?为什么不是二叉树,为什么不是平衡二叉树,为什么不是B树,而偏偏是B+树呢? 我们写业务SQL查询时,大多数情况下,都是范围查询的,如下SQL select * from employee where age between 18 and 28; 为什么不使用哈希结构?我们知道哈希结构,类似k-v结构,也就是,key和value是一对一关系。它用于「等值查询」还可以,但是范围查询它是无能为力的哦。 为什么不使用二叉树呢?先回忆下二叉树相关知识啦~ 所谓「二叉树,特点如下:」
我们脑海中,很容易就浮现出这种二叉树结构图: 但是呢,有些特殊二叉树,它可能这样的哦: 如果二叉树特殊化为一个链表,相当于全表扫描。那么还要索引干嘛呀?因此,一般二叉树不适合作为索引结构。 为什么不使用平衡二叉树呢?平衡二叉树特点:它也是一颗二叉查找树,任何节点的两个子树高度最大差为1。所以就不会出现特殊化一个链表的情况啦。 但是呢:
为什么不使用B树呢?数据量大的话,平衡二叉树的高度会很高,会增加IO嘛。那为什么不选择同样数据量,「高度更矮的B树」呢? B树相对于平衡二叉树,就可以存储更多的数据,高度更低。但是最后为甚选择B+树呢?因为B+树是B树的升级版: ❝ 四、面试官考点之一次B+树索引搜索过程「面试官:」 假设有以下表结构,并且有这几条数据 CREATE TABLE `employee` ( 「面试官:」 如果执行以下的查询SQL,需要执行几次的树搜索操作?可以画下对应的索引结构图~ select * from Temployee where age=32; 「解析:」 其实这个,面试官就是考察候选人是否熟悉B+树索引结构图。可以像酱紫回答~
因此,这条 SQL 查询语句执行大概流程就是酱紫:
因此,这个SQL查询,执行了几次树的搜索操作,是不是一步了然了呀。「特别的」,在 ❝ 五、面试官考点之覆盖索引「面试官:」 如果不用 「解析:」 这个问题,主要考察候选人的覆盖索引知识点。回到 ❝ 所以,相对于上个问题,就是省去了回表的树搜索操作。 六、面试官考点之索引失效「面试官:」 如果我现在给 select * from employee where name like '%杰伦%'; 「解析:」 这里考察的知识点就是,like是否会导致不走索引,看先该SQL的explain执行计划吧。其实like 模糊搜索,会导致不走索引的,如下: 因此,这条SQL最后就全表扫描啦~日常开发中,这几种骚操作都可能会导致索引失效,如下:
七、面试官考点联合索引之最左前缀原则「面试官:」 如果我现在给name,age字段加上联合索引索引,以下SQL执行多少次树搜索呢?先画下索引树? select * from employee where name like '小%' order by age desc; 「解析:」 这里考察联合索引的最左前缀原则以及like是否中索引的知识点。组合索引树示意图大概如下: 联合索引项是先按姓名name从小到大排序,如果名字name相同,则按年龄age从小到大排序。面试官要求查所有名字第一个字是“小”的人,SQL的like '小%'是可以用上 该查询会沿着idx_name_age索引树,找到第一个字是小的索引值,因此依次找到
八、面试官考点之索引下推「面试官:」 我们还是居于组合索引 idx_name_age,以下这个SQL执行几次树搜索呢? select * from employee where name like '小%' and age=28 and sex='0'; 「解析:」 这里考察索引下推的知识点,如果是「Mysql5.6之前」,在idx_name_age索引树,找出所有名字第一个字是“小”的人,拿到它们的主键id,然后回表找出数据行,再去对比年龄和性别等其他字段。如图: 有些朋友可能觉得奇怪,(name,age)不是联合索引嘛?为什么选出包含“小”字后,不再顺便看下年龄age再回表呢,不是更高效嘛?所以呀,MySQL 5.6 就引入了「索引下推优化」,可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。 因此,MySQL5.6版本之后,选出包含“小”字后,顺表过滤age=28,,所以就只需一次回表。 九、 面试官考点之大表添加索引「面试官:」 如果一张表数据量级是千万级别以上的,那么,给这张表添加索引,你需要怎么做呢? 「解析:」 我们需要知道一点,给表添加索引的时候,是会对表加锁的。如果不谨慎操作,有可能出现生产事故的。可以参考以下方法:
总结与练习本文主要讲解了索引的9大关键面试考点,希望对大家有帮助。接下来呢,给大家出一道,有关于我最近业务开发遇到的加索引SQL,看下大家是怎么回答的,有兴趣可以联系我,一起讨论哈~题目如下:
假设type有9种类型,区分度还算可以,status的区分度不高(有3种类型),那么你是如何加索引呢?
参看与感谢
ReferenceMySQL有哪些索引类型 ?: https://segmentfault.com/q/1010000003832312 [2]大表加索引方案: https://zhuanlan.zhihu.com/p/151460679 [3]MySQL实战45讲: https://time./column/article/69636 |
|