SQL语句的执行过程

5 阅读2分钟

本文,我们将整体分析一下一条sql语句在mysql中的执行过程

总体结构

从总体来说,Mysql服务器是一个协同工作的多层架构:

  1. 客户端/连接层

    • 作用:负责身份验证、连接管理、安全校验。就像前台,验证我们的身份(用户名/密码),并分配一个专属的沟通窗口(连接)。
  2. 服务层

    • 查询缓存:在MySQL 8.0之前,这里会缓存查询语句和结果。但由于命中率低、维护代价高,在8.0中已被彻底移除
    • 分析器 (语法与词法分析):检查我们的SQL“句子”有没有拼写错误、语法是否正确。例如,把SELECT写成了SELEC,就会在这里被指出。
    • 优化器:收到一个合法的SQL后,优化器会思考:“完成这个目标,有哪几种执行方案?哪一种成本最低?” 它决定了是否使用索引、使用哪个索引、多表的连接顺序等。
    • 执行器 :根据优化器生成的最优执行计划,调用存储引擎的接口,真正开始干活。
  3. 存储引擎层

    • 负责数据的实际存储和读写。MySQL是“可插拔”的,支持多种引擎(如InnoDB、MyISAM)。InnoDB是目前绝对的主流,它负责管理数据文件、索引、事务、锁等。执行器是通过调用存储引擎提供的API来操作数据的。

一条sql的完整执行过程

现在我们以

SELECT * FROM users WHERE id = 10

这条sql来完整地走一遍整个流程。

第一步,我们在Navicat或者命令行等客户端中,输入命令,提供账户与密码,当验证通过之后,分配连接线程并且检查我们的权限(对的操作和查看权限)

第二步,跳过已经已经废弃的查询缓存到达法分析器

  • 分析器进行词法分析,它会识别出SELECT是关键字,*是通配符,FROM是关键字,users是表名,WHERE是关键字,id是列名,=是操作符,10是常量。
  • 分析器进行语法分析,根据MySQL语法规则,判断这些“单词”组合在一起是否符合SQL语法。比如,是否漏写了FROM关键字。

第三步,分析器确保语法正确后,优化器开始工作,优化器将它的决策,转化为一个可被执行器理解的数据结构,这就是执行计划。可以通过explain来查看它。

第四步,执行器首先根据表名检查权限(即使连接层有库权限,这里会再次校验级权限)。然后,它开始执行优化器生成的计划。

第五步,底层的InnoDB引擎收到执行器的请求,开始执行实际的任务