mysql前言
1.MySQL的驱动
2.数据库的连接池
3.MySQL的工作线程
4.SQL接口
5.SQL解析器
6.查询优化器
7.执行器组件
8.存储引擎接口
1.MySQL的驱动是做什么的?
尤其记得刚刚学习MySQL的时候,引入的pom坐标:mysql-connector-java,这个驱动是啥玩意,其实也很简单理解,其实就是和MySQL建立网络连接:在访问数据库的时候,Java系统必须要和MySQL建立一个网络连接,这个connector就是面向Java语言的驱动。
2.MySQL数据库的连接池到底是用来做什么的?
连接就是一条连接,连接池就是存放这些一条条的连接的,那么为什么要用到连接池,这个也很简单,不可能我执行一条sql语句,去和MySQL建立一次连接,然后执行完事后,再销毁连接,然后依次类推,这样是十分消耗资源和性能的,也是完全没有必要的。其实这个道理和线程池的道理差不多,一个线程,创建销毁,一个连接创建销毁,于是就有了连接池和线程池的管理,让系统把精力放在业务上,而不是耗费大量的功夫在创建连接,销毁连接上,创建一个连接也是十分耗时的,连接池市面上有很多:例如C3P0、Driver等等。
3.MySQL的工作线程主要使用来做什么的?
一条SQL语句,谁来负责从连接中获取,谁会将SQL转交给SQL接口,这里聊下题外话,MySQL并不是你直接发给他一条SQL语句,他就直接去执行了,内部其实和Java系统差不多,经过你的A业务逻辑,再经过你的B业务逻辑,最后return回去对应的数据(结果集),所以这个工作线程主要的作用就是用来从连接池中监听发送过来的SQL请求,以及将监听到的SQL执行请求转发给SQL接口。
4.MySQL内部的SQL接口能直接执行SQL语句吗?
做Java开发的,接口是我们常见的也是常写的,这个不必多说,暴露一个接口,MySQL工作线程从连接中监听SQL请求,转交给SQL接口,SQL接口有直接执行SQL语句的能力么?显然是不行的,不着急,慢慢往后看。
5. MySQL内部的SQL解析器主要又是做什么的?
由此可见,MySQL中的组件还是十分多的,每个组件都是自己做自己对应的操作和工作,那么SQL解析器,实际上就是字面意思,做SQL语句解析用的,你发过去的一条select * from user,这些指令是需要通过SQL解析器得让MySQL认识它才会去执行,例如你发了XXX指令,其他设备回传了一个16进制的字节数组,你是否需要转成对应的10进制等等,才能看懂,或者是才能做操作,道理逻辑一样。
6. MySQL内部的查询优化器是做什么的?
显然易见,优化器就是用来做优化的,不得不说平时俺们写代码也好,写文档也好,名字取的还是非常关键的,【ps:和家里的崽子一样,名字起的好,影响都不得了】,查询优化器说白了就是MySQL会选择最优的查询路径,这个查询优化器会告诉sql,应该按照什么样的步骤和顺序,去执行SQL,选择一条最优的执行路径。
7. 执行器组件
到了这一步,捋顺一下整个过程:MySQL的工作线程监听连接池中的SQL请求,将SQL转发给SQL接口,SQL解析器解析SQL接口中的SQL,转交给SQL优化器,选择最优执行路径,此时要做的就是执行这条SQL了,那么实际上执行器组件就会调用MySQL内部的存储引擎例如InnoDB存储引擎去执行这条SQL,执行器会根据优化器生成一套执行计划,不停的调用存储引擎的各种接口去完成sql语句的执行计划,这里又讲到了存储引擎的各种接口,下面第8点简单描述下;
8.存储引擎接口
存储引擎接口,真正的执行sql语句,最后的一步就是将查询优化器和最优的查询路径交给底层的存储引擎去真正的执行SQL语句,存储引擎会按照一定的步骤去查询内存缓存数据,更新磁盘数据,查询磁盘数据等等一系列的操作。
总结:内容不在多,最后上个简单的流程图便于整篇文章的知识梳理【一条SQL语句经过了层层调度最后调用存储引擎执行SQL的过程】