持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情
面试官:你知道一条SQL语句在MySQL中是如何执行的吗?
Java系统与MySQL交互
MySQL驱动
Java系统去访问一个MySQL数据库,要在系统中加入MySQL驱动才能跟MySQL数据库建立连接,然后执行SQL语句。
此时我们要访问数据库,必须要跟数据库建立一个网络连接,MySQL驱动会在底层跟数据库建立网络连接,有网络连接才能去发送请求给数据库服务器。我们的Java代码基于网络连接去执行增删改查的SQL语句。
数据库连接池
与数据库建立连接开销比较大,如果每次访问数据库都重新建立一个连接,访问结束再销毁连接,那么我们的效率肯定是比较低的。
所以我们一般要使用一个数据库连接池,在池子里维持多个数据库连接,让多个线程使用里面的不同的数据库连接去执行SQL语句,然后执行完SQL语句之后,再把连接放回池子里,方便后续继续使用。基于这样的一个数据库连接池的机制,就可以解决多个线程并发的使用多个数据库连接去执行SQL语句的问题,而且还避免了数据库连接使用完之后就销毁的问题。
MySQL数据库的连接池
我们任何一个系统都会有一个数据库连接池去访问数据库,也就是说这个系统会有多个数据库连接,供多线程并发的使用。同时我们可能会有多个系统同时去访问一个数据库,这都是有可能的。肯定会有很多系统要与MySQL数据库建立很多个连接,那么MySQL也必然要维护与系统之间的多个连接,所以MySQL架构体系中的第一个环节,就是连接池。
MySQL如何执行SQL语句
现在假设我们的数据库服务器的连接池中的某个连接接收到了网络请求,网络连接必须得分配给一个线程去进行处理,由一个线程来监听请求以及读取请求数据,比如从网络连接中读取和解析出来一条我们的系统发送过去的SQL语句。
SQL接口
读取出来一个SQL语句之后,MySQL内部首先提供了一个组件,就是SQL接口(SQL Interface),他是一套执行SQL语句的接口,专门用于执行我们发送给MySQL的那些增删改查的SQL语句。因此MySQL的工作线程接收到SQL语句之后,就会转交给SQL接口去执行。
查询解析器
查询解析器(Parser)负责对SQL接口执行的SQL语句进行解析。所谓的SQL解析,就是按照既定的SQL语法,对我们按照SQL语法规则编写的SQL语句进行解析,然后理解这个SQL语句要干什么事情。让MySQL能看懂SQL语句。
查询优化器
当我们通过解析器理解了SQL语句要干什么之后,接着会找查询优化器(Optimizer)来选择一个最优的查询路径。 针对你编写的SQL语句生成查询路径树,然后从里面选择一条最优的查询路径出来。相当于他会告诉你,你应该按照一个什么样的步骤和顺序,去执行哪些操作,然后一步一步的把SQL语句就给完成了。
执行器
执行器会根据优化器选择的执行方案,去调用存储引擎的接口按照一定的顺序和步骤,就把SQL语句的逻辑给执行了。执行器就会去根据我们的优化器生成的一套执行计划,然后不停的调用存储引擎的各种接口去完成SQL语句的执行计划,大致就是不停的更新或者提取一些数据出来。
调用存储引擎接口
查询优化器选择的最优查询路径交给底层的存储引擎去真正的执行。存储引擎就是执行SQL语句的,他会按照一定的步骤去查询内存缓存数据,更新磁盘数据,查询磁盘数据,等等,执行诸如此类的一系列的操作。
MySQL的架构设计中,SQL接口、SQL解析器、查询优化器其实都是通用的,他就是一套组件而已。但是存储引擎的话,他是支持各种各样的存储引擎的,比如我们常见的InnoDB、MyISAM、Memory等等,我们是可以选择使用哪种存储引擎来负责具体的SQL语句执行的。当然现在MySQL一般都是使用InnoDB存储引擎的。