SQL语句执行过程

1. Mysql 逻辑架构

作为一个有经验的程序员,每天都在和mysql打交道,那么你知道执行一条简单的select语句,需要经历哪些过程?这个就是今天要讲的内容。

在讲sql语句执行过程之前需要了解mysql的架构是怎样的以及它包含哪些组件?
mysql逻辑架构图

分为Server层和存储引擎两部分

  • Server 层包括:连接器、查询缓存、分析器、优化器、执行器等,涵盖Mysql的大多数核心服务功能,以及所有的内置函数(如日期、时间、数据以及加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
  • 存储引擎层:负责数据的存储和提取,其架构模式是插件式的,支持Innodb、MyISAM、Memory等多个存储引擎,Mysql5.5.5后默认存储引擎为Innodb

2. SQL语句执行过程

  1. 连接器

    负责将mysql客户端和服务端建立连接,连接成功后,获取的当前连接用户的权限,这里获取到的权限对整个连接都有效,一旦连接成功后,如果中途管理员更改了权限,那么只有等到该用户下次重连才会更新权限

  2. 查询缓存

    连接成功后,即开始要正式执行select 语句了,但是在执行查询之前,mysql会看下有没有该条语句的缓存内容,如果有缓存直接读取缓存并返回结果,不在执行后面的步骤。

    如果没有缓存则继续往后执行,并将执行结果和语句保存到缓存中

    注意:

    • mysql8 后已经没有查询缓存这个功能了,因为缓存非常容易被清空掉,命中率低,只要对表有一个更新呢,这个表上的所有缓存都会被清空
    • 如果缓存查到结果,在返回结果前需要做权限校验,判断该用户是否有权限查询
  3. 分析器

    既然没有查到缓存,就要执行sql语句了,在执行之前肯定需要先对sql语句进行解析,分析器主要对sql语句进行语法和语义分析,检查单词是否拼写错误,还有检查这个表或者字段是否存在。

    假如分析器检测出错误,会出现以下错误信息:

    1
    2
    ERROR 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”的内容。

    并且停止查询操作。

  4. 优化器

    在经过分析器后,mysql就理解了你所要执行的操作了,基本上对于同一个sql语句,mysql内部或许有好几种执行方案,例如存在多个索引的情况下,应该选择哪个索引?多张表有关联查询时,如何确认各表的连接顺序。

    这些方案的执行结果都一样,但是执行效率不一样,所以在mysql执行之前都要尝试找出一个最优的方案来,这就是优化器主要工作。

  5. 执行器

    经过优化器选定一个方案后,执行器就按照这个方案执行sql语句,在执行语句之前会先判断是否有权限,如果没有权限就会return,并提示没有权限

    权限校验完毕,继续打开表,然后调用存储引擎所提供的接口去查询,最后返回结果数据。

到这,一条sql语句就执行完了,这里知识讲了大致的流程,具体在mysql底层实现是非常复杂的。