面试官问:select语句的执行流程是?可以画图吗?

JAVA小咖秀

共 1286字,需浏览 3分钟

 · 2020-08-21



起因


大家好,我是一条SQL,大家经常用我来做增删改查,有一次,我听面试官问一个面试者,你知道sql语句执行的过程吗?

答:先写一条SQL语句,然后连接到服务端,服务端执行SQL,返回结果给我们。

最后,这个面试官让他回家等通知了。

其实,为了返回一条数据给业务,我做了很多事情,我先来带大家认识一下我的组成吧。

一般从整体来说MySQL分为Server层和存储引擎层。

Server层,这一层的是跨引擎的,像存储过程、触发器、视图等。


存储引擎层,从名字可以听出来,没错,就是存取数据的。当然它的分类也是很多滴,下图展示部分,还有更多的引擎,但是不常用。


还有一些其他队的存储引擎就不一一列举了,一般来说我们听过比较多的有InnoDB、MEMORY、MyISAM,InnoDB最常用。当你不指定时,默认引擎就是InnoDB,当然如果需要指定,直接命令来指定,例如: ENGINE = 引擎名称。

 CREATE TABLE TABLE_NAME
(
...
ENGINE=INNODB

到了关键环节了,大家不是很关心我的工作流程问题嘛,下面一张图,就是我的工作时要做的一些事情,还不少吧。

mysql执行图

首先,要先执行我,需要先连接的数据库,我会先走连接器,验证好账号密码正确后,我就可以去缓存区看是不是存在的,如果缓存里面有,那我工作量就少了,如果我有权限的话就会把结果直接给客户端。

如果缓存查不到,我就会去分析器了,在这里对我进行词法分析,如果不符合SQL的词法,就会返回错误。

通过词法验证后,接下来就会对我做语法分析,不符合要求,直接返回错误。符合要求,我被解析成语法解析树。

接下来就要进入优化器了,优化器会根据自己的判断,来做决定如何优化,比如如何选择索引或者联表查询时先去查哪个表。所以,有的时候即使程序员指定了一些索引,我依然不会用,我表示我有自己的想法

然后我带着优化方案,走向执行器,先让人看看我有没有这个权限执行,检查完事,执行器就会调用对应的引擎接口,依次的把符合条件的数据装进结果集。同时,还会把结果存到缓存中,最后把结果集返回客户端就完事了。

大家可以结合图,看一下,总体下来还是挺简单的。

参考

官网  https://www.mysql.com/cn
《深入浅出MySQL》
拉钩 《高性能MySQL实战》
极客时间 《MySQL实战45讲》

最后

很早前写的草稿,一直没发,今天发出来,如有不足,请大家赐教。和小伙伴们一起学习, 持续更新中。。。

另外,mysql执行图弄了15种样式,如果大家想看一个自己觉得比较舒服的版本,可以加小编的微信来要图。


加我微信回复"mysql执行图"即可

1.  Docker 禁止被列入美国“实体名单”的国家、企业、个人使用

2.  SpringBoot几种定时任务的实现方式


原创不易,在看吧!

浏览 22
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报