本文,我们将整体分析一下一条sql语句在mysql中的执行过程
总体结构
从总体来说,Mysql服务器是一个协同工作的多层架构:
-
客户端/连接层
- 作用:负责身份验证、连接管理、安全校验。就像前台,验证我们的身份(用户名/密码),并分配一个专属的沟通窗口(连接)。
-
服务层
- 查询缓存:在MySQL 8.0之前,这里会缓存查询语句和结果。但由于命中率低、维护代价高,在8.0中已被彻底移除。
- 分析器 (语法与词法分析):检查我们的SQL“句子”有没有拼写错误、语法是否正确。例如,把
SELECT写成了SELEC,就会在这里被指出。 - 优化器:收到一个合法的SQL后,优化器会思考:“完成这个目标,有哪几种执行方案?哪一种成本最低?” 它决定了是否使用索引、使用哪个索引、多表的连接顺序等。
- 执行器 :根据优化器生成的最优执行计划,调用存储引擎的接口,真正开始干活。
-
存储引擎层
- 负责数据的实际存储和读写。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引擎收到执行器的请求,开始执行实际的任务