假设执行一条SQL语句:
(1)将SQL语句发送到Mysql服务器,首先服务器就需要一个线程来监听请求以及读取请求数据,比如从网络连接中读取和解析出来一条客户端发来的SQL语句。
(2)SQL接口,负责处理接收到的SQL语句,MySQL内部首先提供了一个组件,就是SQL接口,他是一套执行SQL语句的接口,专用于执行我们发送给MySQL服务器的增删改查的SQL语句。
(3)查询解析器,SQL接口怎么执行SQL语句呢?比如 select id,name,age from users where id=1 ,MySQL服务器是无法理解这些SQL语句的,所以就需要查询解析器,他会对SQL语句进行拆解,我们要从 users 表里面查询数据,查询 id 字段的值等于1的那行数据 然后对查询出来的那行数据提取里面的 id,name,age”三个字段。 所谓的SQL解析,就是按照既定的SQL语法,对我们按照SQL语法规则编写的SQL语句进行解析,然后理解这个SQL语句要干什么事情。
(4)查询优化器,当通过SQL解析器理解了这条SQL语句要干什么之后,接着会找查询优化器来选择一个最优的查询路径,这个查询优化器会根据你编写的SQL生成查询树,然后从里面选择一条最优的查询路径出来。(生成执行计划)
(5)**存储引擎**,把查询优化器选择的最优查询路径,也就是你到底应该按照一个什么样的顺序和步骤去执行这个SQL语句的计划,**把这个计划交给底层的存储引擎去真正的执行**。(执行执行计划)
(6)**执行器**,**存储引擎**可以帮助我们去访问内存以及磁盘上的数据,那么谁来调用存储引擎的接口呢?总不可能是查询优化器的,实**际上存储引擎和查询优化器执行有个桥梁,执行器**。(调用存储引擎执行执行计划获取结果给查询优化器)<br /> 执行器会根据优化器选择的执行计划,去调用存储引擎的接口按照一定的顺序和步骤把SQL语句的逻辑执行;总结为,执行器根据优化器生成的一套执行计划,然后不停的调用存储引擎的各种 接口去完成SQL语句的执行计划,大致就是**不停的更新或者提取一些数据出来**。