一条SQL语句的执行历程

  • 连接客户端
  • 命中缓存
  • 解析优化
  • SQL执行
  • 执行结果



在数据库管理系统中,每当你敲下一条SQL,按下执行键的时候,不管这条SQL是简单还是复杂,从按下执行键到返回数据结果展现出来这个过程都是一致的,每一步都有其存在的必要意义。那么下面就来详细分析一条SQL从按下执行键之后经历了哪些过程?

连接客户端

首先你要有一个可以执行SQL的可视化的客户端,并且已经连接好了Mysql服务端,比如这样

一条SQL语句的执行历程_执行过程

命中缓存

然后你编写好一条SQL之后,按下执行键,这个时候客户端就可以向 MySQL 服务发送 SQL 语句了,MySQL 服务收到 SQL 语句后,就会解析出 SQL 语句的第一个字段,看看是什么类型的语句。如果查询语句,MySQL 就会先去查询缓存里查找缓存数据,如果缓存中有这条 SQL对应的数据内容,那么直接返回,如果没有则继续向下执行。

解析优化

在正式执行 SQL 查询语句之前, MySQL 会先对 SQL 语句进行解析,解析包括词法解析,语法解析等,验证你执行的这条 SQL 可以被执行。并且会按照Mysql的内部逻辑对你提供的 SQL 进行优化,优化后的 SQL 会按照索引、主键等优化信息加快 SQL 语句的执行效率。

SQL执行

那么经过解析优化之后,那么你的 SQL 就算进入执行状态了,接着就要进入执行 SQL 查询语句的流程了,每条SELECT 查询语句流程主要可以分为下面这三个阶段:预处理阶段、执行阶段,在这一阶段同样会执行优化,最后执行完成之后就可以成功返回数据了。

执行结果

比如这里有一条 SQL 语句

select * from crm_account_screen_performance_target where target_start_time <='2024-03-18 00:00:00' and target_end_time >= '2024-03-18 00:00:00';

一条SQL语句的执行历程_数据库_02


那么我们也可以看一下 SQL 客户端工具对于这条 SQL 执行过程的剖析

一条SQL语句的执行历程_执行过程_03


在整个SQL 执行过程中,从你敲下SQL 点击【执行】命令的那一刻,SQL 的历程就开始了starting。SQL会首先校验当前执行 SQL 的用户是否有权限 checking permissions,随后有权限,继续向下打开需要执行的数据表 Opening tables,然后开始初始化 SQL init ,锁定系统执行环境 System lock,随后SQL 执行器会对当前 SQL 进行优化 optimizing 以及 统计 statistics。继续向下看,进入到准备 preparing 阶段,然后数据库服务会创建临时表用于存放临时查询数据 Creating tmp table ,并对查询的结果进行排序 Sorting result,随后执行 executing,执行完成之后发送数据到请求方 Sending data,创建排序索引 Creating sort index,然后结束执行操作 end,随后移除临时表 removing tmp table,本次查询结束 query end,关闭数据库表 closing tables,最后释放整个查询涉及到的操作 freeing items,并记录本次慢查询日志 logging slow query,最后完成全部本次 SQL 执行操作内容并 cleaning up。整个 SQL的执行过程可以通过执行过程中涉及到的命令做一个详细的分析,感兴趣的可以自己尝试看看 SQL 执行过程。