一条SQL查询语句的执行过程
“看一件事千万不要直接陷入细节里,你应该要先鸟瞰其全貌,这样能够帮助你从高纬度理解问题。”
SQL查询语句执行过程鸟瞰图

故事
有一个岗位,很多人去竞争。一面是与服务器建立连接(卡学历),二面是分析器分析语法(简历关),三面是优化器进行优化(技术面),四面是执行器开始执行(办理入职)。
程序猿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的侃侃而谈,技术面成功蒙混过关。接下来,就是准备入职工作。
执行器
执行之前,会检查是否有权限,有权限的话,就开始执行查询,并将结果集返回。