MySQL在平时的工作使用中对我们大多数人来说,其实就是对应着一条条的sql语句,对于其中的内部设计,其实知道的人并不多

假如我们有一个简单的web应用,当我们接到请求之后,请求会通过Tomcat,此时Tomcat中可能会有很多线程并发的去处理请求,需要处理的这些请求可能就意味着许多的sql,所以如果只有一个数据库连接的话,那不是坑爹了,所以这里就需要一个类似线程池的东西,这就是数据库连接池。数据库连接池除了提供多个数据库连接以供请求,还负责连接系统和MySQL数据库服务器,系统跟MySQL建立连接时,会根据传递的账号密码进行验证,库表权限的验证

现在sql已经从我们的系统走到了MySQL中,接下来sql又去了哪呢?

当我们的数据库连接池接收到了某个请求时,就需要有一个线程去监听请求及读取请求数据,也就是读取和解析sql语句

之后sql会经过SQL Interface,SQL接口,表示接受用户的SQL命令,并且返回用户需要查询的结果,比如select from就是调用SQL 接口

其实我们写的sql对于MySQL来说是无法解析的,就像我们的Java代码JVM也无法理解一样,此时我们需要MySQL的查询解析器(Parser)来对sql进行解析,按照一定的语法规则对sql进行解析之后,MySQL才知道我们真正想干什么

现在MySQL终于知道了我们的sql是什么样子的了,接着MySQL会为我们的sql选择最佳的查询方式,此时sql会进入查询优化器(Optimizer)选择一个MySQL认为的最佳路径去查询,这里的最佳路径并不能代表这条sql执行的最佳方案,有些时候查询优化器也可能会选择一个不太好的方式去执行,但是大部分情况下,查询优化器还是能起到一个很好的作用的。查询优化器所做的工作就是一个SQL语句可能有多种方式可以查询出结果,而查询优化器会针对SQL语句生成查询路径树,从那个里面选择最优的查询路径

接下来轮到了执行器,执行器首先会判断用户对要操作的表有没有操作权限,如果没有的话,那么就会直接返回失败,如果有权限的话,执行器会根据查询优化器生成的执行计划,不停地调用存储引擎的各种接口去完成SQL语句的执行计划

接下来到了MySQL中的重头戏,也就是存储引擎,其中最常见也是默认的存储引擎就是InnoDB,还有MyISAM等一些其他的存储引擎,但是我在这里不打算细讲,留到之后单独来说。简单来说,存储引擎所做的事情其实就是按照一定的步骤去查询内存缓存数据,更新或查询磁盘数据等等

存储引擎操作之后,sql操作的数据就会落到磁盘了,此时一条sql也完成了他的使命,接下来我用一张图串起来整个的流程帮助大家理解

laravel mysql插入数据后返回对象数据信息_MySQL