MySQL架构设计--服务层

83 阅读5分钟

MySQL架构设计

  1. MySQL驱动到底是什么东西

我们如果要在Java系统中去访问一个MySQL数据库,必须得在系统的依赖中加入一个MySQL驱动,有了这个MySQL驱动才能跟MySQL数据库建立连接,然后执行各种各样的SQL语句。

他会在底层跟数据库建立网络连接,有网络连接,接着才能去发送请求给数据库服务器!

  1. MySQL数据库的连接池是用来干什么的

多个线程并发处理多个请求的时候,都要去抢夺一个连接去访问数据库的话,那效率肯定是很低下的,所以一般我们必须要使用一个数据库连接池,也就是说在一个池子里维持多个数据库连接,让多个线程使用里面的不同的数据库连接去 执行SQL语句,然后执行完SQL语句之后,不要销毁这个数据库连接,而是把连接放回池子里,后续还可以继续使用。

基于这样的一个数据库连接池的机制,就可以解决多个线程并发的使用多个数据库连接去执行SQL语句的问题,而且还避免了数据库连 接使用完之后就销毁的问题。

实际上MySQL中的连接池就是维护了与系统之间的多个数据库连接。除此之外,你的系统每次跟MySQL建立连接的 时候,还会根据你传递过来的账号和密码,进行账号密码的验证,库表权限的验证。

  1. SQL接口:负责处理接收到的SQL语句

MySQL内部首先提供了一个组件,就是SQL接口(SQL Interface),他是一套执行SQL语句的接口,专门用于执行我们 发送给MySQL的那些增删改查的SQL语句 。

因此MySQL的工作线程接收到SQL语句之后,就会转交给SQL接口去执行。

  1. 查询解析器:让MySQL能看懂sql语句

这个查询解析器(Parser)就是负责对SQL语句进行解析的,所谓的SQL解析,就是按照既定的SQL语法,对我们按照SQL语法规则编写的SQL语句进行解析,然后理解这个SQL语句要干什么事情。

  1. 查询优化器:选择最优的查询路径

当我们通过解析器理解了SQL语句要干什么之后,接着会找查询优化器(Optimizer)来选择一个最优的查询路径。

这个看起来确实很抽象,我们可以用一个极为通俗简单的例子,让大家理解一下所谓的最优查询路径是什么。

例如:select id,name,age from user where id=1;

  1. 直接定位到“users”表中的“id”字段等于1的一行数据,然后查出来那行数据“id,name,age”三个字段的值就可以了
  2. 先把“users”表中的每一行数据的“id,name,age”三个字段的值都查出来,然后从这批数据里过滤出来“id”字段等于1的那行数据的“id,name,age”三个字段

上面这就是一个最简单的SQL语句的两种实现路径,其实我们会发现,要完成这个SQL语句的目标,两个路径都可以做到,但是哪一种更好呢?显然感觉上是第一种查询路径更好一些。

所以查询优化器大概就是干这个的,他会针对你编写的几十行、几百行甚至上千行的复杂SQL语句生成查询路径树,然后从里面选择一条最优的查询路径出来。

相当于他会告诉你,你应该按照一个什么样的步骤和顺序,去执行哪些操作,然后一步一步的把SQL语句就给完成了。

  1. 执行器:根据执行计划调用存储引擎的接口

执行器就会去根据我们的优化器生成的一套执行计划,然后不停的调用存储引擎的各种接口去完成SQL 语句的执行计划,大致就是不停的更新或者提取一些数据出来。

  1. 调用存储引擎接口,真正执行SQL语句

我们已经知道一个SQL语句要如何执行了,但是我们现在怎么知道哪些数据在内存里?哪些数据在磁盘里?我们执行的时候是更新内存的数据?还是更新磁盘的数据?我们如果更新磁盘的数据,是先查询哪个磁盘文件,再更新哪个磁盘文件?

这个时候就需要存储引擎了,存储引擎其实就是执行SQL语句的,他会按照一定的步骤去查询内存缓存数据,更新磁盘数据,查询磁盘数据,等等,执行诸如此类的一系列的操作

MySQL的架构设计中,SQL接口、SQL解析器、查询优化器其实都是通用的,他就是一套组件而已。

但是存储引擎的话,他是支持各种各样的存储引擎的,比如我们常见的InnoDB、MyISAM、Memory等等,我们是可以选择使用哪种存储引擎来负责具体的SQL语句执行的。