一条SQL语句在MySQL中的执行过程

147 阅读4分钟

一、MySQL的基本结构(V8.0以上)

在MySQL整体结构中,可以拆分为以下2个部分:

  • 服务层

    服务层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。当更新数据后,查询缓存会被清理,因此在8.0以上的版本中,彻底移除掉了这个模块。

  • 存储引擎层

    存储引擎层是被设计为插件模式的。因此在MySQL中支持多种存储引擎,其中最为常用的便是InnoDB。存储引擎主要实现一些读写接口,共用同一个服务层

  • 结构图如下

    .png

二、各模块的主要作用

  • 连接器

    连接器负责跟客户端建立连接、获取权限、维持和管理连接。当客户端发起一个连接,首先会进行TCP连接,然后输入账密进行验证,验证通过后会通过权限表查询用户权限。当一个连接成功后,它的权限值即便被更改,也不会影响当前连接,只有下一次连接才会应用新的权限。可以通过show processlist命令查看线程的状态(一个线程即一个连接)。当一个连接闲置太长,会被断开,这个时间由wait_timeout控制,默认8小时。

    连接分为长连接和短连接两种。数据库里面,长连接是指连接成功后,如果客户端持续有请求,则一直使用同一个连接。短连接则是指每次执行完很少的几次查询就断开连接,下次查询再重新建立一个。因此建议使用长连接,因为连接的动作比较复杂。

    MySQL在执行过程中临时使用的内存是管理在连接对象里面的。因此当连接时间过长,内存占用过大,可能导致异常重启。2种解决方案如下:

    • 定期断开长连接
    • 执行大操作后,执行mysql_reset_connection初始化连接资源,这个过程不会重连和权限校验,但会初始化状态
  • 分析器

    • 词法分析

      将输入的SQL语句进行词组拆分

    • 语法分析

      对词法分析的结果进行分析,是否满足正确的SQL语法。

    • 语义检查

      当语法分析结果正常时,还需要进行语义检查,比如查询的列是否存在,表是否存在等。

  • 优化器

    一条SQL语句的执行计划不是唯一的,存在很多种查询途径都可以获得同样的结果,优化器的目的就是找到最佳的执行计划。总的来说,优化器分为以下2步:

    • 逻辑查询优化-查询重写

      逻辑查询优化就是对SQL进行重写,通常采用的方式是对 SQL 语句进行等价变换,对查询进行重写,而查询重写的数学基础就是关系代数。对条件表达式进行等价谓词重写、条件简化,对视图进行重写,对子查询进行优化,对连接语义进行了外连接消除、嵌套连接消除等。

    • 物理查询优化-优化器模式

      • 基于规则的优化器

        简单来说,就是在优化器内嵌入规则,当SQL语句满足某一规则时,则执行相应规则制定的执行计划。

      • 基于代价的优化器

        这个模式是评估每条可能的执行计划的代价,选择代价最小的作为执行计划。MySQL内置了一系列的代价模型参数,比如创建一个表的代价是多少,进行一次键比较的代价是多少,通过这些代价参数,可以算出一个大致的执行代价。

  • 执行器

    MySQL通过优化器得到了一个执行计划,此时便会通过执行器执行。此时会判断是否有权限,如果有权限,则打开表继续执行,此时会根据不同的引擎调用不同的接口,没有则报错。