Mysql语句的执行逻辑
Mysql的架构
简单来说Mysql分为Server层和存储引擎层。
Server层
主要包括连接器、查询缓存、分析器、优化器、执行器等,所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图,函数等,还有一个通用的日志模块 binlog 日志模块。
- 连接器:身份认证和权限分析。
- 缓存(Mysql8.0中移除):将近期查询结果储存下来,加快查询效率。
- 分析器:词法分析和语法分析。
- 优化器:优化查询路径。
- 执行器:执行语句和返回结果。
(架构关系如图所示)
存储引擎层
主要负责数据的存储和读取,采用可以替换的插件式架构,支持 InnoDB、MyISAM、Memory 等多个存储引擎,其中 InnoDB 引擎有自有的日志模块 redolog 模块。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5 版本开始就被当做默认存储引擎了。
语句分析
Mysql的语句分为查询与更新(增删改)。
1 | select * from user where id = 1 and name = "张三" |
对于这一条查询语句,Mysql的执行流程可以这样解释:在语句分析前,连接器就会对用户进行权限分析,判断是否有执行该语句的权力,然后程序将访问缓存(Mysql8.0版本前),查询语句的对应结果,如果缓存中没有对应的Key-Value,分析器将对程序进行词法分析,提取如where,select等关键词与表名,字段名等信息,语法分析将对该语句的语法进行判断,若语法正确,程序将按照优化器给出的最佳路径**(这里的最佳路径只是优化器认为的最佳,而不是我们认为的,对于上面这一条一句,程序既有可能先对id字段查询,也有可能先对name字段查询)**执行查询。
1 | update user set id = 1 where id = 2 |
对于这一条更新语句,流程大体与查询语句相似,由于涉及对数据库表的更新,更新语句不会访问缓存。更新语句将涉及日志模块,Mysql自带的日志模块是binlog(归档日志),所有的存储引擎都可使用,我们常用的InnoDB还自带一个**redolog(重做日志)**模块,下面将以InnoDB引擎讨论程序执行流程。
查询到id为2这一条字段后,将id设置为1,然后调用InnoDB的API接口写入这一条数据,然后告诉执行器完成执行,引擎将调用redolog将其设置为prepare就绪状态,执行器记录binlog日志后告知引擎设置redolog为提交状态,更新完成。