一、逻辑架构
MySQL也采用分层架构。插件式的存储引擎架构将查询处理和其他的系统任务以及数据的存取相分离,这样就可以根据业务需求来选择适合的存储引擎。
1、层次结构
连接层 —— 业务逻辑处理层(处理sql)—— 数据存储引擎 —— 硬盘
(1)连接层
是一些客户端和连接服务,主要完成类似于连接处理、授权认证、及相关的安全方案。该层引入了连接池的概念,为通过认证安全接入的客户端提供线程。该层还可实现基于SSL的安全链接。
(2)服务层
在处理底层数据前,在这一层对SQL进行分析、优化及执行内置函数,会确定查询表的顺序和是否利用索引等,最后生成相应的执行操作。在解析查询之前,要查询缓存,这个缓存只能保存查询信息以及结果数据,如果请求一个查询在缓存中存在,就不需要解析,优化和执行查询了,直接返回缓存中所存放的这个查询的结果。各个存储引擎提供的功能都集中在这一层,如存储过程,触发器,视图等。
(3)引擎层
存储引擎真正的负责了Mysql中数据的存储和提取,服务器通过存储引擎API与存储引擎交互,API包含了很多底层操作,如开始一个事务,或者取出有特定主键的行。存储引擎不能解析SQL,互相之间也不能通信,仅仅是简单的响应服务器的请求。
(4)存储层
主要将数据存储在运行于裸设备的文件系统之上,并完成与存储引擎的交互。
2、逻辑模块
(1)Connectors:指的是不同语言中与SQL的交互。
(2)Management Serveices & Utilities:系统管理和控制工具。
(3)Connection Pool:连接池
管理缓冲用户连接,线程处理等需要缓存的需求。负责监听对 MySQL Server 的各种请求,接收连接请求,转发所有连接请求到线程管理模块。每一个连接上 MySQL Server 的客户端请求都会被分配(或创建)一个连接线程为其单独服务。而连接线程的主要工作就是负责 MySQL Server 与客户端的通信,接受客户端的命令请求,传递 Server 端的结果信息等。线程管理模块则负责管理维护这些连接线程。包括线程的创建,线程的 cache 等。
(4)SQL Interface: SQL接口。
接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface。
(5)Parser: 解析器。
SQL命令传递到解析器的时候会被解析器验证和解析。在 MySQL中我们习惯将所有 Client 端发送给 Server 端的命令都称为 query 。
主要功能:
a . 将SQL语句进行语义和语法的分析,分解成数据结构,然后按照不同的操作类型进行分类,然后做出针对性的转发到后续步骤,以后SQL语句的传递和处理就是基于这个结构的。
b. 如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的。
(6)Optimizer:查询优化器。
SQL语句在查询之前会使用查询优化器对查询进行优化,得出一个最优的策略,告诉后面的程序如何取得这个 query 语句的结果,他使用的是“选取-投影-联接”策略进行查询。
(7)Cache和Buffer: 查询缓存。
将客户端提交给MySQL的Select类query请求的返回结果集cache到内存中,与该query的一个hash值做一个对应。该Query 所取数据的基表发生任何数据的变化之后,MySQL会自动使该query的Cache失效。在读写比例非常高的应用系统中,Query Cache对性能的提高是非常显著的。当然它对内存的消耗也是非常大的。如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等。
(8) 存储引擎接口
插件式管理,目前各种数据库产品中,基本上只有 MySQL 可以实现其底层数据存储引擎的插件式管理,这个模块实际上只是 一个抽象类。默认下MySql是使用MyISAM引擎,它查询速度快,有较好的索引优化和数据压缩技术,但是它不支持事务,InnoDB支持事务,并且提供行级锁,应用也相当广泛,Mysql也支持自己定制存储引擎。
注意:存储引擎是基于表的,而不是数据库,甚至一个库中不同的表使用不同的存储引擎。
二、存储引擎
查看默认和当前的存储引擎:show variables like '%storage_engine%;
可参考: https://www.cnblogs.com/kerrycode/p/6571868.html
MyISAM和InnoDB比较