MySQL软件架构
客户端
客户端就是诸如我们平时所用到的Java连接数据库的JDBC等,主要是给MySQL Server发指令和发sql语句来完成我们想要达成的目的。
MySQL Server
从整体上看,MySQL Server就是连接了客户端和文件系统的桥梁,帮我们去处理了客户端发起的请求以及反馈从文件系统中获取的数据内容等。
连接器
顾名思义,连接器就是用来接收客户端的连接的,一般都是TCP连接。
缓存
当连接器连接到客户端并接收到一条Sql查询语句后,会先去缓存中查找,如果该缓存中有这条语句的结果,则直接返回该结果,但由于缓存具有局限性,在后续的mysql8.0基本已废弃。
分析器
当一条语句通过连接器进到分析器后,分析器会对其进行词法分析语法分析等,分析该语句的类型、结构等。
优化器
经过分析器分析后的结果就会交由优化器进行优化,比如对这条sql语句的执行顺序、过程进行优化,选出最优的索引来提升查询效率等
执行器
执行器将优化过的语句进一步分析,做出物理执行计划,执行计划直接调用后面的表的存储引擎
常见存储引擎
MyISAM
MyISAM是MySQL5.5.5之前的默认存储引擎,主要特点是插入数据快,占用空间小,空间利用率较高,因为他不支持事务,这也是后来不再是MySQL默认存储引擎的原因。
InnoDB
MySQL5.5.5之后的默认存储引擎就是InnoDB,也是目前最主流的存储引擎,InnoDB给MySQL带来了事务和外键,也因为事务的支持所需要用到的redo log和undo log也为MySQL提供了支持崩溃修复能力,同时也有并发控制的控制能力,即MVCC,但是也因为事务,使得MySQL的磁盘利用率比较低,不只有需要维护数据的空间,还有各种log等。
Memory
从字面上看不难看出Memory是内存型的数据库,而他的所有数据都在内存中,速度快,但在内存中的最大问题就是数据安全性差,处理器一断电数据就没有了,无法持久化,所以这种类型的数据库就比较适合建一些临时表,和Redis有点类似,但最大的不同也是在于Redis是基于k、v键值对的非关系型数据库,而Memory本质上还是一张表。
Archive
这种数据库是将数据压缩了之后再存入磁盘中,所以空间利用率是比较高的,但是同样的存在问题就是因为数据是压缩后存入的,那么在读取数据的时候也需要解压,这样读取的时间就会比较长了。而Archive的插入速度也是比较快的,不像MySQL有redo log、undo log等,它更像是一个仓库,往里放数据即可。但是Archive不支持索引,每一次的获取都需要循环遍历,所以查询性能非常低。