暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL高频面试题(1)

双非进大厂 2021-07-30
372



MySQL向来是大厂面试的必考题,而且挖得都很深。从索引,到锁,再到主从、容灾,等等。

让我们走进MySQL的世界,我会带你刷遍MySQL高频面试题,让你在面试中能够侃侃而谈



双非进大厂


EXPERIENCE

一条SQL语句是如何执行的



其实这个这道题,需要你对MySQL的架构有一个大致的了解。


看着架构图,就可以清楚地看到SQL语句在MySQL的各个功能模块中的执行过程。


我们把MySQL拆解一下,看看里面都有哪些“零件”



大体来说,MySQL可以分为Server层和存储引擎层两部分。


Server层包括连接器、查询缓存、分析器、优化器、执行器等,而存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持InnoDB、MyISAM、Memory等多个存储引擎。


现在最常用的存储引擎是InnoDB,它从MySQL 5.5.5版本开始成为了默认存储引擎。


p.s. 这里可以跟面试官简单提一下InnoDB和MyISAM的区别,比如InnoDB支持事务、行锁、外键等等



连接器


连接器负责跟客户端建立连接、获取权限、维持和管理连接。


连接器这里不是很重要,简单了解就好了。


如果用户名或密码不对,你就会收到一个"Access denied for user"的错误,然后客户端程序结束执行。


如果用户名密码认证通过,连接器会到权限表里面查出你拥有的权限。之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限。




查询缓存


在连接建立完成后,你就可以执行语句了。执行逻辑就会来到第二步:查询缓存。


MySQL拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以key-value对的形式,被直接缓存在内存中。key是查询的语句,value是查询的结果。如果你的查询能够直接在这个缓存中找到key,那么这个value就会被直接返回给客户端。


但是大多数情况下我们不会使用查询缓存,因为查询缓存往往弊大于利。


因为查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。MySQL 8.0版本直接将查询缓存的整块功能删掉了,彻底没有这个功能了。



分析器


如果没有命中查询缓存,就要开始真正执行语句了。首先,MySQL需要知道你要做什么,因此需要对SQL语句做解析。


如果你是计算机科班出身,那一定了解过编译原理。这里就是词法分析和语法分析。


分析器先会做“词法分析”。你输入的是由多个字符串和空格组成的一条SQL语句,MySQL需要识别出里面的各种字符串分别是什么,代表什么。


MySQL从你输入的"select"这个关键字识别出来,这是一个查询语句。它也要把字符串“T”识别成“表名T”,把字符串“ID”识别成“列ID”。


做完了这些识别以后,就要做“语法分析”。根据词法分析的结果,语法分析器会根据语法规则,判断你输入的这个SQL语句是否满足MySQL语法。


如果你的语句不对,就会收到“You have an error in your SQL syntax”的错误提醒,比如下面这个语句select少打了开头的字母“s”。


mysql> elect * from t where ID=1; 


ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'elect * from t where ID=1' at line 1


一般语法错误会提示第一个出现错误的位置,所以你要关注的是紧接“use near”的内容。



优化器


经过了分析器,MySQL就知道你要做什么了。在开始执行之前,还要先经过优化器的处理。


比如有多个索引可以选择,优化器的作用就是决定选择使用哪一个方案。这里你可以选择和面试官展开说一说,比如MySQL选择的索引不一定好,是用某某原理去选择的,我们可以用explain看一看执行计划,可以强制走某一条索引balabala



执行器


MySQL通过分析器知道了你要做什么,通过优化器知道了该怎么做,于是就进入了执行器阶段,开始执行语句,首先会校验权限。


mysql> select * from T where ID=10; 


ERROR 1142 (42000): SELECT command denied to user 'b'@'localhost' for table 'T'


如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。


比如我们这个例子中的表T中,ID字段没有索引,那么执行器的执行流程是这样的:


  • 调用InnoDB引擎接口取这个表的第一行,判断ID值是不是10,如果不是则跳过,如果是则将这行存在结果集中;

  • 调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。

  • 执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。


至此,一条SQL语句就执行完成了。




写在结尾


这周的工作比较忙,所以内容稍稍有些少。


因为大家不一定都是Java技术栈的,所以面试题我都先尽量选择的无关语言类的,比如计算机网路、操作系统、数据库等等。


MySQL这块预计会有个七八篇文章,毕竟它的内容比较多,而且又都是高频考点哈哈。让我们一起努力啃下它!


瑞思拜~





“2021年会更好的”

“点个关注,为您分享更多的双非进大厂经验”



【文案】:小洋人

【校验】:小雨






点个在看 你最好看




文章转载自双非进大厂,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论