起因
大家好,我是一条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 禁止被列入美国“实体名单”的国家、企业、个人使用
原创不易,在看吧!