【MySQL实战45讲笔记】01、一条SQL查询语句是如何执行的?

大家好,我是被白菜拱的猪。

一个热爱学习废寝忘食头悬梁锥刺股,痴迷于girl的潇洒从容淡然coding handsome boy。

本系列主要针对《MySQL实战45讲》,对每一讲阅读完之后再用自己的语言将本章的内容进行复述,也可称之为读书笔记。让自己的大脑对内容在进行记忆,自己看所记忆的内容和自己讲出来的内容记忆程度还是有很大区别的。

本讲所说的是查询语句,每一种操作可以笼统的分为读写,读也就是查询,也是这一讲所叙述的内容,而写也可当做为更新,是下一讲所说的内容,不同的操作,底层所对应的实现是不同的,更新涉及到日志。为了讲明一条查询语句是如何执行的,我们首先要对MySQL的框架有个清楚的了解。

MySQL主要分为Server层和存储引擎层,Server层里面包含连接器、查询缓存、分析器、优化器、执行器,有的地方还单拎出来一个连接层,存储引擎层是插件式的,也就是说跟个插槽似的,拔出来在插进去,熟悉的存储引擎有InnoDB和MyISAM,像阿里他是自己搞出来一个存储引擎,“插”上去使用。所以这种插件式的一个优点就是方便扩展。

下面对每一部分进行介绍:

连接器

顾名思义就是负责连接用的,执行SQL语句前肯定要连接数据库,输入用户密码进行验证是否正确,每一个用户都有自己的权限,当权限被修改的时候,针对本次连接是无效的,在连接的时候在权限表中读出的那个权限将作为本次连接的权限,所以下一次进行连接,所修改的才有效。

连接又分为长连接和短连接,长连接就是执行完之后不断开连接,短连接就是执行几次查询之后下次查询在开启一个连接,每次建立连接是一个非常复杂的过程,所以我们建议使用长连接。

但是长连接又引出一个问题就是长时间内存占用过大,因为内存时随着连接的断开而释放,内存占用过大就会导致OOM,系统进行异常重启,我们解决的办法有定期断开连接或者是重新初始化资源,重新初始化资源则不同再次进行连接。

查询缓存

连接建立好之后,我们先到查询缓存那看有没有这条SQL语句之前执行的结果,假如有就直接返回,这就类似于Redis,不用再去执行下面的操作,提高了执行的速度,但是我们是不建议使用查询缓存的,甚至在MySQL8.0之后直接删除了该模块,因为只要对表进行了更新操作,有关这个表的缓存都会被清空,频繁的操作会使性能降低。

扫描二维码关注公众号,回复: 12804659 查看本文章

查询缓存主要使用与那些不经常改动的表。

分析器

假如查询缓存没有命中,下面则将认认真真的执行这条SQL语句,第一大关就是要对SQL语句进行分析,因为SQL语句本身就是一个字符串,分析器要对其进行词法分析和语法分析,词法分析就是判断那些是命令,哪个是表名称,语法分析则是看这个命令写的对不对,表是否存在,列是否存在。假如有错误,则报错。我们经常看到的Unknow column…以及 you have an error in your SQL syntax也就是在这层发生的。

优化器

好了分析完之后,咱在检查检查有没有优化的地方,在join连接时,是先在哪个表查呢?那么多索引是到底是选择哪一个呢?这都是优化器来决定的,使性能达到最大化。

执行器

最后come baby,由执行器和存储引擎搭配来完成执行操作,我们需要记住判断是否有权限执行的这一操作是在执行器中,如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。所以引擎是针对表而言而不是数据库。

像我们之前说的判断列是否存在,他实际上是发生在分析器,列是一个结构,在创建表的时候就已经确定,不需要去打开表,去查看实际的数据。

假如有查询缓存且没命中的话,最后执行的结果会更新到查询缓存中。

这就是一条SQL查询语句的执行过程,通过看完本讲内容,对MySQL的结构相信也有了大致的了解,学习路上长路漫漫,我与你同行。

猜你喜欢

转载自blog.csdn.net/weixin_44226263/article/details/113836050