一条SQL查询语句的执行过程

125 阅读2分钟

一条SQL查询语句的执行过程

​ “看一件事千万不要直接陷入细节里,你应该要先鸟瞰其全貌,这样能够帮助你从高纬度理解问题。”

SQL查询语句执行过程鸟瞰图

image-20240709122527947

故事

​ 有一个岗位,很多人去竞争。一面是与服务器建立连接(卡学历),二面是分析器分析语法(简历关),三面是优化器进行优化(技术面),四面是执行器开始执行(办理入职)。

​ 程序猿Bob(select id from t1 join t2 where t1.c = 10 and t2.d = 20;)去应聘。

连接器

​ 客户端与MySQL服务器建立连接,连接分为长连接和短连接,长连接就是客户端持续输入SQL语句,与服务端交互。而短连接是,在客户端输入几条SQL语句之后,就进行断开。

​ 客户端与服务器建立连接是TCP/IP连接,建立连接的过程比较耗费资源,所以我们应该尽量使用长连接。然而,长连接有可能导致MySQL服务器占用太多内存,因为MySQL执行过程中会生成大量临时内存。所以为了解决这个问题,我们可以在长连接之后,执行mysql_reset_connection来重置连接,或者定期断开长连接。

​ 客户端与服务器建立连接之后,【查询缓存登场(MySQL8.0退出历史舞台)】,分析器登场。

​ Bob是989学历,所以成功过了第一面。

分析器

​ 分析器会对SQL语句的词法进行分析、语法进行分析,例如,select、update等,检查是增删改查的哪种语句,并且会将列名“ID”分析为对应的列ID。

​ 经过分析器的分析之后,这条SQL语句就正式被MySQL认可了。

​ Bob的简历内容非常丰富,所以过了二面。

优化器

​ Bob开始面对技术的拷打,面试官问Bob简历上的SQL语句,如何执行更好。Bob分析说,这条SQL语句,有两种可能,

1、第一种是先查询t1表中c=10的所有数据,然后根据id去查询t2表,然后找出t2表中d=20的数据。

2、第二种就是反过来,先查询t2表,然后查询t1表。

哪种方法效率高,就使用哪种方法执行。

​ 因为Bob的侃侃而谈,技术面成功蒙混过关。接下来,就是准备入职工作。

执行器

​ 执行之前,会检查是否有权限,有权限的话,就开始执行查询,并将结果集返回。