面试常问-MySQL篇

背景介绍:小码面向java工作2年了,到了这个令人心跳的工资翻番的时期,也忍不住进行了跳槽三连鞭写-投-面,终于约上了面试,于是小码开始了他的面试征途.

--------------------------------------------------------------------------------------------------------------------------------

正式面试:果不其然,面试官问到了MySQL,对于准备充分的小码同学,这不手拿把抓嘛.

---------------------------------------------------------------------------------------------------------------------------------

面试官:简单说一下MySQL索引吧.

小码:(嘿嘿,小意思)索引是MySQL为了快速进行数据的查找创建的一种数据结构,常用的有哈希索引和B+树索引.Hash索引的底层是hash表,查找时,调用一次hash函数就可以获取到相应的键值,之后进行回表查询获得实际数据.B+树底层实现是多路平衡查找树.对于每一次的查询都是从根节点出发,查找到叶子节点方可以获得所查键值,然后根据查询判断是否需要回表查询数据.

面试官:那你能不能简单说下他们各自的优缺点.

小码:因为hash索引经过hash函数建立索引,所以一般情况下等值查询效率更高,但索引的

顺序与原顺序无法保持一致,所以不支持范围查询和排序.因为hash函数的不可预测,hash索引也不支持模糊查询以及多列索引的最左前缀匹配.等值查询时当键值存在大量重复时会发生索引碰撞导致性能低下.而且hash索引都需要回表查询数据

B+树则因为他的原理所以支持范围查询和排序且在等值查询时稳定.而且在满足聚簇索引,覆盖索引时不需要回表查询数据

所以我们一般采用B+树索引,我们经常使用的InnoDB存储引擎的默认索引也是B+树索引.

面试官:刚刚提到了B+树在满足聚簇索引和覆盖索引的时候不需要回表查询数据,什么是聚簇索引?

小码:在B+树的索引中,叶子节点可能存储了当前的key值,也可能存储了当前的key值以及整行的数据,储存整行数据的我们就称之为聚簇索引,当查询使用聚簇索引时,在对应的叶子节点,可以获取到整行数据,因此不用再次进行回表查询.

面试官:那非聚簇索引一定会回表查询吗?

小码:不是的,当查询字段全部命中索引时,就不用回表查询.举个简单的例子,假设我们在员工表的年龄上建立了索引,那么当进行select age from employee where age < 20的查询时,在索引的叶子节点上,已经包含了age信息,不会再次进行回表查询.

------------------------------------------------------------------------

面试官:(还不错啊)能简单谈谈你对MySQL事务的理解吗?

小码:事务是一系列的操作,他们要符合ACID特性.最通俗理解就是:事务中的操作要么全部成功,要么全部失败.

面试官:那你能说一下 ACID吗

小码:A是指原子性.就是上面说的,要么全部成功,要么全部失败.不可能只执行一部分操作.

C是指一致性.系统(数据库)总是从一个一致性的状态转移到另一个一致性的状态,不会存在中间状态.

I是指隔离性. 通常来说:一个事务在完全提交之前,对其他事务是不可见的.注意前面的通常来说加了红色,意味着有例外情况.

D是指持久性.一旦事务提交,那么就永远是这样子了,哪怕系统崩溃也不会影响到这个事务的结果.

面试官:那你知道多事务并发会造成什么问题吗

小码:(有点慌,这块不太熟啊)应该是脏读,不可重复读和幻读.

脏读:a事务读取了b事务未提交的内容,b事务后面因为本身问题进行了回滚,就会导致a事务读取的数据无效,这就是脏读.

不可重复读:a事务进行时读取了某行数据,b事务后面又修改提交了这行数据,当a事务再次读取这行数据时,读取到的就是b事务提交过的,a事务两次读取的数据不一致,这就称为不可重复读.

幻读:a事务对表中数据进行了修改,这种修改涉及到表中的全部数据行,同时b事务在该表新增了一行数据,a事务修改完后发现表中还有没有修改的数据行,就好像发生了幻觉一样。

为了解决这些问题,MySQL采用了事务隔离.

面试官:既然提到了事务隔离,那你能简单说一下吗

小码:(完了,自己挖坑了)MySQL有四种隔离级别,分别是未提交读,已提交读,可重复读和可串行化,InnoDB默认使用的是可重复读隔离级别.它里面的具体原理不是特别了解.(紧张,擦汗)

(ps:码人y:事务隔离及原理这个坑我先挖下,后面再出一篇详细补哈,有兴趣的可以留意一下

,两三年一般问到这就差不多了,更深的你就可以像小码同学一样对面试官说不是很了解了哈)

------------------------------------------------------------------------

面试官:(小伙子还挺强,终于问到不知道的了,哈哈)好吧,那你对MySQL锁了解吗

小码:了解的,MySQL的锁机制是为了保证并发事务访问的次序,避免出现事务并发产生的数据不一致的结果.常用锁的类别有共享锁,排他锁.

共享锁又叫读锁,比如a事务对数据对象加了读锁,那么a只能进行读操作,别的事务来操作时也只能添加读锁进行读取操作,读锁保证了其他事务可以正常读取数据,但在a释放数据的读锁之前不能对数据做任何修改。

排他锁又叫写锁,比如a事务对数据对象加了写锁,a事务可以进行读和写操作,但其他事务不能对该数据进行任何操作.

-----------------------------------------------------------------------

面试官:工作中有做过SQL优化吗

小码:有的,工作中慢查询的统计主要由运维在做,会定期将业务中的慢查询反馈给我们.我们根据反馈结果进行分析,先搞清楚慢的原因,一般可能是查询条件未命中索引,load了不需要的数据列,数据量太大这三个方面导致的.

所以优化也是针对这三个方向来的,

  • 首先分析语句,看看是否load了额外的数据,可能是查询了多余的行并且抛弃掉了,可能是加载了许多结果中并不需要的列,对语句进行分析以及重写.

  • 分析语句的执行计划,然后获得其使用索引的情况,之后修改语句或者修改索引,使得语句可以尽可能的命中索引.(可展开说,创建合理索引,尽量使用单表查询,如果必须使用优先外连接其次内连接,尽量不使用子查询)

  • 如果对语句的优化已经无法进行,可以考虑表中的数据量是否太大,如果是的话可以进行横向或者纵向的分表.

前两个方案实际操作过,分库分表因为和业务关联度很高,一般都是领导弄,所以我并没有实际操作过(提前填坑,我可真是个小机灵^^)

---------------------------------------------------------------------

面试官:好,关于MySQL这块我们就先到这,接下来我们说一下...

--------------------------------------------------------------------------------------------------------------------------------------------------

小码:今天MySQL相关的面试问题就到这里,各位如果还有其他被高频问到的面试题可以在评论区或私信我哦,我会及时更新的^^

如果感觉这篇文章对您有所帮助,请一键三连,您的支持是我更新的最大动力.咱们下期见^^

了解更多面试知识,关注同名微信公众号"码人y"

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值