mysql数据库索引面试题 mysql组合索引底层原理( 四 )


MySQL索引下推
面试官:嗯 。非常不错,那你再说一下什么是索引下推吧
我:(我特么 。。。精通MySQL就这么被问啊,早知道不写精通MySQL了,累死我了 。。。可以来个赞给我续续命吗家人们)
首先索引下推是MySQL5.6版本引入的一种优化手段,说白了就是优化了一下,具体优化后有了哪些效果呢,切听帅气的小奇给你娓娓道来 。
关键点:
1、第一个字段为非等值字段 。
2、查询的字段建立了联合索引 。
前提:
name和age建立了联合索引
例如 select name,age from student where name like ‘%李*%’ and age=20;
这个时候如果在5.6之前,我们会在联合索引中先找到所有name为李开头的数据id(主键),然后再去主键索引(聚集索引)中找age为20的数据的id拿回来,然后将最后合并的数据根据id再去聚集索引中找,这样其实是两次回表查询 。
而在5.6之后,我们在联合索引中就直接将name为李开头的和age等于20的数据id筛选出来了,然后再去聚集索引中查询,这样就只进行了一次回表查询 。
总结:5.6之前如果查询字段为非等值字段,那么后面的查询条件就回去聚集索引中进行判断,5.6之后非等值字段后面的查询条件在当前非聚集索引中也可以进行判断 。
MySQL索引失效
面试官:嗯 。非常不错,那你能说一下索引在什么情况下会失效吗?
我:在特么没有建立索引的情况下会失效 。。。
面试官:嗯 。你等我找一下棍子
我:额,在如下这几种情况下会失效 。
1、在使用不等于!= 或者<> 这样的会失效 。
2、在使用不包含 not in , 不存在 not exists 这样的会失效 。
3、在使用空 is null,不为空 is not null 这样的会失效 。
4、在使用小于 <、大于 >、<=、 >= 这些的时候,mysql优化器会根据索引比例、表的数据量大小等因素来决定走不走索引 。
EXPLAIN
面试官:嗯 。那我写了一条sql,我怎么知道这条sql有没有走索引呢
我:使用explain解释器来,在sql语句前面加上explain就可以来

mysql数据库索引面试题 mysql组合索引底层原理

文章插图

explain中有多列,我们直接来看type这一列,这一列表示访问类型,即MySQL决定以哪种形式来查找表中的行,是根据索引还是全表扫描,表示查找数据行记录的大概范围 。
type中的数据类型从优到差依次为:
system > const > eq_ref > ref > range > index >ALL
当我们写了一条sql语句发现他的type是ALL的时候我们就要考虑一下怎么优化一下了,因为ALL是最差的,我们就需要琢磨一下怎么优化,当然优化到system是最好的,但是一般不会优化到这种程度,你只要前进一小步对于整个系统来说就是文明一大步 。。。
MySQL事务隔离级别
面试官:可以可以,回答的不错,不过你是精通MySQL,那我必须得全面的问你MySQL的相关知识,你再坚持坚持,和我再大战个三百回合
我:(我特么谢谢您 。。。)
面试官:数据库有哪些事务隔离级别,MySQL使用了哪种级别呢?
我:数据库有四种事务隔离级别
读未提交
读已提交
可重复读
可串行化

MySQL默认是可重复读事务隔离级别
面试官:嗯 。那MySQL有哪些锁呢?
我:从颗粒度来分,MySQL有表锁和行锁 。
表锁:每次操作锁住整张表,开销小,加锁快;不会出现死锁;锁定力度大,发生锁冲突的概率最低 。
行锁:每次操作锁住一行数据 。开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度最高 。
MVCC机制
面试官:嗯 。那你知道MVCC机制吗,他的原理是什么?
我:(这特么好难讲明白的 。。。)那我就简单的说一下 。


推荐阅读