在关系型数据库中mysql所占的份额是越来越高,其学习价值也是一直在飙升。不管是在什么样的架构中都会出现有mysql的身影。作为一名互联网从业者,如果不识庐山真面目那么~~~~~~(自行补充)
Mysql的逻辑架构
下图就是mysql的简单逻辑架构图:

MySQL架构总共三层,在上图中以虚线作为划分。
首先,最上层的客户端指的是mysql的图形化连接软件和各种编程语言的mysql连接模块,例如Python的MySQLdb模块,还有API接口等等。
第二层就是mysql的核心服务,也称为service层。包括:查询解析、分析、优化、缓存以及所有的内置函数(例如:日期、时间、数学和加密函数)。同时,所有的跨存储引擎的功能都在这一层实现:存储过程、触发器、视图等。
第三层就是存储层,也就是innodb存储引擎。存储引擎负责MySQL中数据的存储和提取。
Mysql系统架构图
上图只是mysql系统架构大的模块图,其实每一层的结构都相当复杂,下图就是详细模块图:

指的是不同语言与SQL的交互。
2、connection management
管理用户连接,线程处理等需要缓存的需求。负责监听对 MySQL Server 的各种请求,接收连接请求,转发所有连接请求到线程管理模块。每一个连接上 MySQL Server 的客户端请求都会被分配(或创建)一个连接线程为其单独服务。而连接线程的主要工作就是负责 MySQL Server 与客户端的通信,接受客户端的命令请求,传递 Server 端的结果信息等。线程管理模块则负责管理维护这些连接线程。包括线程的创建,线程的 cache 等。
3、 Management Serveices & Utilities 系统管理和控制工具。
4、 SQL Interface
接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface
5、 Parser
SQL命令传递到解析器的时候会被解析器验证和解析。解析器是由Lex和YACC实现的,是一个很长的脚本。在 MySQL中我们习惯将所有 Client 端发送给 Server 端的命令都称为 query ,在 MySQL Server 里面,连接线程接收到客户端的一个 Query 后,会直接将该 query 传递给专门负责将各种 Query 进行分类然后转发给各个对应的处理模块。
主要功能: a 、 将SQL语句进行语义和语法的分析,分解成数据结构,然后按照不同的操作类型进行分类,然后做出针对性的转发到后续步骤,以后SQL语句的传递和处理就是基于这个结构的;
b、 如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的。
6、 Optimizer
查询优化器:SQL语句在查询之前会使用查询优化器对查询进行优化。就是优化客户端请求query,根据客户端请求的 query 语句,和数据库中的一些统计信息,在一系列算法的基础上进行分析,得出一个最优的策略,告诉后面的程序如何取得这个 query 语句的结果。使用的是“选取-投影-联接”策略进行查询:
用一个例子就可以理解: select uid,name from user where gender = 1; 这个select 查询先根据where 语句进行选取,而不是先将表全部查询出来以后再进行gender过滤;然后根据uid和name进行属性投影,而不是将属性全部取出以后再进行过滤。最后将这两个查询条件联接起来生成最终查询结果。
7 、Cache和Buffer
查询缓存:主要功能是将客户端提交 给MySQL 的 Select 类 query 请求的返回结果集 cache 到内存中,与该 query 的一个 hash 值 做一个对应。该 query 所取数据的基表发生任何数据的变化之后, MySQL 会自动使该 query 的Cache 失效。在读写比例非常高的应用系统中, Query Cache 对性能的提高是非常显著的。当然它对内存的消耗也是非常大的。
如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等。
8 、存储引擎接口
MySQL区别于其他数据库的最重要的特点就是其插件式的表存储引擎。MySQL插件式的存储引擎架构提供了一系列标准的管理和服务支持,这些标准与存储引擎本身无关,可能是每个数据库系统本身都必需的,如SQL分析器和优化器等,而存储引擎是底层物理结构的实现,每个存储引擎开发者都可以按照自己的意愿来进行开发。
注意:存储引擎是基于表的,而不是数据库。
存储引擎
InnoDB引擎是MySQL默认的事务型引擎,使用非常广泛,极擅长处理短期事务,具有自动崩溃恢复的特性,在日常开发中,一般都要求使用该引擎。
Innodb架构图

。内存结构
内存结构又包括四大组件
Buffer Pool:缓冲池,是主内存中的一个区域,在InnoDB访问表和索引数据时会在其中进行高速缓存,大量减少磁盘IO操作,提升效率。
Change Buffer:写缓冲区,避免每次增删改都进行IO操作,提升性能。
Adaptive Hash Index:自适应哈希索引,使用索引关键字的前缀构建哈希索引,提升查询速 度。
Log Buffer:日志缓冲区,保存要写入磁盘上的日志文件的数据,缓冲区的内容定期刷新到磁盘。
。磁盘结构
Tables:数据表的物理结构。
Indexes:索引的物理结构。
Tablespaces:表空间,数据存储区域。
Data Dictionary:数据字典,存储元数据信息的表,例如表的描述,结构,索引等。
Doublewrite Buffer:位于系统表空间的一个存储区域,InnoDB在BufferPool中刷新页面时,会将数据页写入该缓冲区后才会写入磁盘。
Redo Log:记录DML操作的日志,用来崩溃后的数据恢复。
Undo Logs:数据更改前的快照,可以用来回滚数据。
Innodb特点描述
。支持事务
事务内在执行一组SQL语句时,要么全部成功,要么全部失败。
。支持分布式事务
分布式事务指即使不同操作位于不同的服务应用上,仍然需要保证事务的特性。常见场景:订单和库存在不同的服务中,但却能保持一致性。
。支持行级锁
加锁时锁定一行数据的锁机制就是行级别锁定(row-level)。MySQL5.7版本中只有InnoDB引擎支持。锁定的粒度小,自然支持的并发就高,锁定的机制也随之变的复杂。
。支持MVCC
多版本并发控制,通过保存数据在某个时间点的快照来实现的。这意味着一个事务无论运行多长时间,在同一个事务里能够看到数据一致的视图。根据事务开始的时间不同,同时也意味着在同一个时刻不同事务看到的相同表里的数据可能是不同的。
。支持聚簇索引
是一种对磁盘上实际数据重新组织以按指定的一个或多个列的值排序。由于聚簇索引的索引页面指针指向数据页面,所以使用聚簇索引查找数据几乎总是比使用非聚簇索引快。
数据库工作流程

在这里,我从数据库架构的三个层面分别介绍数据库的工作流程:
客户端连接:
1.连接处理:客户端会通过初始化模块,跟连接进程/线程模块数据库建立TCP连接,并请求一个连接线程。如果连接池中有空闲的连接线程,则分配给这个连接,如果没有,在没有超过最大连接数的情况下,创建新的连接线程负责这个客户端。
2.授权认证:在真正的操作之前,还需要调用用户模块进行授权检查,来验证用户是否有权限。通过后,方才提供服务,连接线程开始接收并处理来自客户端的SQL语句。
核心服务:
1、连接线程接收到SQL语句之后,将语句交给命令分发器并记录日志,然后SQL命令解析器部分进行语法分析和语义分析。
2、如果是一个查询语句,则可以先看查询缓存中是否有结果,如果有结果可以直接返回给客户端。
3、如果查询缓存中没有结果,就需要真的查询数据库引擎层了,于是发给SQL优化器,进行查询的优化。如果是表变更,则分别交给insert、update、delete、create、alter处理模块进行处理。
存储层
1、通过访问控制模块,让表管理模块打开表,获取相应的锁。
2、先查询缓存页中有没有相应的数据,如果有则可以直接返回,如果没有就要调用存储引擎接口从磁盘上去读取。
3、最后,获取数据后让连接线程/进程模块返回给客户端,关闭连接,释放连接线程。