一条Select的自述!这不就是“你”的一辈子吗!



原由mysql


你们好,我是一条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.  面试官问:Spring 为啥默认把bean设计成单例的?web

2.  危险!80% 用户正在考虑放弃 Oracle JDK…面试

3.  面试官问:Mybatis 框架下 SQL 注入攻击的 3 种方式sql

4. 再见 count(*)数据库

5. 工做发狂:Mybatis 中$和#千万不要乱用!缓存

 
    
    
     
     
              
     
 
    


    
原创不易,在看吧!

本文分享自微信公众号 - Java面试进化论(AuditionEvolution)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。微信

相关文章
相关标签/搜索