「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战」
MySQL数据库管理系统,在软件开发中用的比较多,基本上很多公司都在使用MySQL数据库,是一款比较成熟的产品。MySQL的体系架构如下图所示:
从上面的图可以看出,MySQL主要分为三层:连接层、服务层、存储引擎层。
连接层
连接池:缓存连接信息
在客户端跟数据库进行交互通信的时候,每次建立连接的时候都需要消耗很多时间,也会占据很多资源,连接池作用就是将这些连接缓存起来,后面需要执行SQL语句的时候,无需在二次建立链接,直接取出来用就行。
SQL接口:负责处理接收到的SQL语句
SQL L接口是一套执行SQL语句的接口,专门用于执行我们发送给MySQL的增删改查的SQL语句,因此MySQL的工作线程接受到SQL语句之后,就会转交给SQL接口去执行,等待SQL执行完成后,将执行的结果返回给客户端。
服务层
缓存器:将查询结果缓存起来
将SQL执行的结果缓存起来,下次如果遇到一模一样的SQL语句,那就直接从缓存中缓存结果给客户端返回,不在交给后续的流程去执行。但是在执行过程中,缓存器的功能一般都是关闭的,主要原因我认为有几点:
- 缓存命中的规则十分的苛刻,必须要一模一样的语句才可以命中缓存规则
- 缓存执行结果会增加服务器额外的性能开销,一般数据库都要保证高性能,减少额外的开销
- 缓存不是数据库的强项,专业的事情交给专业的人去干,现在市面上有比较完善的缓存服务,例如Redis等等
查询解析器:让MySQL能看懂SQL语句
查询解析器主要作用就两点:
- 分解SQL语句,将SQL语句分解成各种数据结构,并且将分解好的结构传递给后续步骤,在后续的执行过程中都是基于解析器分解好的数据结构,而不再是客户端传入的SQL语句
- 在分解SQL语句过程中发现无法分解,就说明客户端传入的SQL语句存在语义问题,将具体的语义错误回执给客户端,这样的就起到了语义校验功能
查询优化器:选择最优的查询路径
查询解析器将SQL语句进行分解后,并不是直接交给执行器去执行语句,而是要先经过查询优化器,对我们的SQL语句进行优化,有些时候并不是按照我们的SQL语句的语法去执行,会对SQL语句进行改写,以服务器认为最优的执行结果去执行SQL。
执行器:根据执行计划调用存储引擎的接口
结果前面一连串的操作后,才会到执行器,执行器就会去根据我们的优化器生成的一套执行计划,然后不停的调用存储引擎的各种接口去完成SQL语句的执行计划,将执行的结果从储存引擎获取然后返回给客户端。
存储层
存储层将数据持久化到磁盘文件中,保证数据不丢,存储层主要有存储引擎来完成,主要有两类存储引擎:InnoDB,MyISAM。
InnoDB存储引擎
在MySQL5.5之后数据库默认的存储引擎,主要优势:
- 支持事务,保证插入的数据一致性
- 锁的颗粒度为行级锁,这样可以支持更高的并发
- 支持外键:这个在实际中用的比较少,一般外键都是我们在开发中保证外键,并不在数据库显示声明、
MyISAM存储引擎
在MySQL5.5之前,都采用是MyISAM存储引擎,相对于InnoDB在综合实力方面要差一点,
- 不支持事务,这样的话就无法保证数据一致性
- 对插入的性能比较高,查询速度也比较快,毕竟不支持事务,在查询插入的时候会减少很多操作