执行select语句的过程

199 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

执行select语句的过程

Mysql的结构

首先要明白Mysql的架构

Mysql的架构分为两个部分,Server层和存储引擎层

  • Server层:

    • 负责建立连接,分析和执行sql
    • Mysql大部分核心功能模块都在这里实现。主要包括连接器、解析器、预处理器、优化器、执行器等
    • 所有的内置函数和所有跨存储引擎的功能(储存过程、触发器、视图等)都在这里实现
  • 储存引擎:负责数据的储存和提取

select执行流程

1、连接器

主要负责:建立连接、管理连接、校验用户身份

首先要连接Mysql服务,执行sql语句。连接的过程要经过TCP三次握手,Mysql是基于TCP协议传输的。

可以通过show processlist查看mysql被多少个客户端连接。一个已经建立起来的连接,管理员也无法修改权限

Mysql可以设置最大空闲连接的时长,通过wait_timeout参数控制,默认是8小时。通过Max_Connections控制最大连接数

Mysql也和http一样,有长连接和短连接的区别。使用长连接可能导致占用内存改变多,Mysql在执行过程中临时使用内存管理连接对象。这些连接资源只有在连接断开后才会被释放,如果占用内存过大。有可能会被系统搞强制kill,然后Mysql进行重启。解决方法有两个:

  • 定期释放长连接
  • 客户端主动重置连接,调用Mysql_reset_connection()函数重置

2、查询缓存

在建立连接之后,mysql会发送sql语句,然后会查询缓存,就是把sql语句当成key,然后查有没有对应的value。

但是这个缓存功能挺鸡肋的,只要表进行更新操作,那么缓存就要被清空,就没用了。

Mysql8直接删除了缓存的功能。对于8之前的版本,我们可以认为控制缓存是否打开,query_cache_type。

3、解析sql

在正式解析sql查询语句之前,Mysql会对sql词法、语法做解析,重构语法树,方便后续模块读取表名、字段、语句类型

  • 词法解析:会解析关键字,构建sql语法树

  • 语法解析:会判断输入的sql语句是否符合Mysql的语法

    • 表不存在或者字段不存在并不是在解析器中做的

4、执行

执行每个select语句会主要经过三个阶段

  • 预处理阶段:

    • 检查表或者字段是否存在
    • 将select * 中的 *扩展到所有列
  • 优化阶段:优化器负责将sql查询语句的具体方案确定下来,选择代价最小的方案,比如选择索引方式

  • 执行阶段:根据方案执行,从储存引擎读取数据,返回给客户端

    主要有三种执行方案

    • 主键索引查询:查询的字段是主键 Select id from t
    • 全表扫描:这个字段没有索引,优化器决定进行一个全表的扫描,主要还是使用了主键索引进行查询Select name from t
    • 索引下推:联合索引会优先判断联合索引列是否符合需要,实在不行才会回表查询,可以有效减少回表查询次数