1. Mysql 逻辑架构
作为一个有经验的程序员,每天都在和mysql打交道,那么你知道执行一条简单的select语句,需要经历哪些过程?这个就是今天要讲的内容。
在讲sql语句执行过程之前需要了解mysql的架构是怎样的以及它包含哪些组件?
分为Server层和存储引擎两部分
- Server 层包括:连接器、查询缓存、分析器、优化器、执行器等,涵盖Mysql的大多数核心服务功能,以及所有的内置函数(如日期、时间、数据以及加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
- 存储引擎层:负责数据的存储和提取,其架构模式是插件式的,支持Innodb、MyISAM、Memory等多个存储引擎,Mysql5.5.5后默认存储引擎为Innodb
2. SQL语句执行过程
连接器
负责将mysql客户端和服务端建立连接,连接成功后,获取的当前连接用户的权限,这里获取到的权限对整个连接都有效,一旦连接成功后,如果中途管理员更改了权限,那么只有等到该用户下次重连才会更新权限
查询缓存
连接成功后,即开始要正式执行select 语句了,但是在执行查询之前,mysql会看下有没有该条语句的缓存内容,如果有缓存直接读取缓存并返回结果,不在执行后面的步骤。
如果没有缓存则继续往后执行,并将执行结果和语句保存到缓存中
注意:
- mysql8 后已经没有查询缓存这个功能了,因为缓存非常容易被清空掉,命中率低,只要对表有一个更新呢,这个表上的所有缓存都会被清空
- 如果缓存查到结果,在返回结果前需要做权限校验,判断该用户是否有权限查询
分析器
既然没有查到缓存,就要执行sql语句了,在执行之前肯定需要先对sql语句进行解析,分析器主要对sql语句进行语法和语义分析,检查单词是否拼写错误,还有检查这个表或者字段是否存在。
假如分析器检测出错误,会出现以下错误信息:
1
2ERROR 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 ‘xxxxxx’ at line 1
一般语法错误会提示第一个出现错误的位置,所以你要关注的是紧接“use near”的内容。并且停止查询操作。
优化器
在经过分析器后,mysql就理解了你所要执行的操作了,基本上对于同一个sql语句,mysql内部或许有好几种执行方案,例如存在多个索引的情况下,应该选择哪个索引?多张表有关联查询时,如何确认各表的连接顺序。
这些方案的执行结果都一样,但是执行效率不一样,所以在mysql执行之前都要尝试找出一个最优的方案来,这就是优化器主要工作。
执行器
经过优化器选定一个方案后,执行器就按照这个方案执行sql语句,在执行语句之前会先判断是否有权限,如果没有权限就会return,并提示没有权限
权限校验完毕,继续打开表,然后调用存储引擎所提供的接口去查询,最后返回结果数据。
到这,一条sql语句就执行完了,这里知识讲了大致的流程,具体在mysql底层实现是非常复杂的。