开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 6 天,点击查看活动详情
mysql执行流程
前文
mysql是我们在开发过程中十分常用的一种关系型数据库,本文将主要从sql语句执行的角度,对于mysql基础结构相关知识进行总结。
mysql语句是如何执行的
首先来看一条sql语句:
select id,name,age from user where id = 1
如上面所示,这是一条十分简单的sql语句,目的是从用户表中查询出id为1用户的姓名、年龄信息。
- 当该语句进行执行时,首先需要通过连接器进行连接,也就是通过mysql链接池等首先建立与mysql服务的连接。
- 连接后会进行缓存的查询,这里的缓存内容主要是mysql服务器的数据缓存,缓存内容为查询的结果。而在8.0版本之后,mysql服务器上的缓存已经被移除。其实本质上由于关系型数据库中的数据经常会发生变化,也就导致缓存的内容需要经常更新,相信这也是缓存被移除的一个原因。
- 经过缓存器后,下一步也就到达了分析器。分析器主要会进行一些查询的前置工作的处理,也就是会解析我们的待执行sql语句,并对语句进行处理,形成msyql执行时所采用的语法树。在这个阶段可能会发现sql语法存在一些问题,自然也就会抛出该阶段的对应异常。
- 下一步也就到了实际msyql语句的执行器中。首先要进行预处理,会将sql查询时使用的select具体化为实际的字段,这也是为什么我们开发过程中不推荐采用select *的原因,可以减少预处理阶段的工作量。预处理后进入到优化器中,这里主要是通过索引对sql语句进行优化。例如索引的使用、索引下推等等都是在这个阶段进行处理,目的在于提高我们sql语句的执行速度。优化后的语句,也就直接到执行器之中进行执行,查询我们所需要的数据,当然执行时是通过上一阶段优化器的优化结果进行执行,处理其中可能出现的索引查询、回表查询等内容,得到我们最终的数据。
总结
执行一条sql语句主要会经过连接器-》缓存器-》分析器-》执行器(预处理-》优化-》执行各阶段的处理,以最快的查询速度得到我们的处理结果。而我们在sql的开发过程中也需要合理的进行sql语句的编写以及索引的设置,尽可能的更多命中索引,减少回表次数提高实际sql语句的执行效率。