> 文档中心 > MySQL 架构原理

MySQL 架构原理

大家好,欢迎学习本篇文章,探索技术,追求本源。

MySQL 体系架构

接下来介绍的 MySQL 体系结构,它是属于 MySQL 架构原理当中的内容,通过 MySQL 体系架构的学习,我们可以了解到 MySQL 数据库的内容结构,以及各组件之间的关系和作用,这部分内容相对于 MySQL 的发展史和架构演变相对难一些。不过没关系,在学习的过程我会慢慢讲解,详细的介绍这块内容。

当然,有读者会问,学习这块内容对我们今后的工作由什么好处呢?其实在多数的情况下,我们不知 MySQL 的内容结构,并不影响我们使用,好比如说我们买一辆,做为开车的我们,更不用去关心车的内部构成以及各个部件的作用,只要我们会简单的操作,如一脚油门踩下去,一脚刹车就可以了,即使车出了问题,我们可以将车直接送到 4S 店去修,修车的他们必须得知道车内部结构了。

但是咋们作为软件开发人员而言,跟开车还是有很大的区别的,这就相当于我们开发的时候,经常会使用大量的开源免费产品,那么开源免费的产品我们是不花钱的,这样一来,质量没有保障,出了问题售后也不太及时。那么这相对于我们在路边捡一辆二手车一样,难起来开,中间出了肯定会出现各种各样的问题,出现了问题我们得自己来修了。这时候,我们必须得具备修车能力,必须了解车内部结构以及各个部件间的关系和作用。

MySQL 架构原理学得好的话,对于我们今后工作中出现问题有很大的帮助,如故障排查,性能优化以及 SQL 执行过程有一个深刻的理解。

接下来我们来看 MySQL 体系架构。

在这里插入图片描述

上图就是 MySQL 体系架构图,观察上图发现,MySQL 体系架构的知识点比较多,全是英文单词,啥也看不懂。这就对了,啥都懂了,我们才要进行学习吗。这些英文单词我提前给大家翻译出来了。

客户连接层

客户端连接器(Client Connectors):指能够与 MySQL 服务器建立连接的客户端,目前几乎支持所有主流的服务端编程技术。如常用 Java、C、Python 等,它们通过各自 API 技术与 MySQL 建立连接。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gBOJ4qyn-1609064903194)(G:\笔记\精讲 MySQL\img\image-20201129211424058.png)]

思想:为解决资源的频繁分配、释放所造成的问题,为数据库连接建立一个“缓冲池”。

原理:预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。

作用:进行身份验证、线程重用,连接限制,检查内存,数据缓存;管理用户的连接,线程处理等需要缓存的需求。

服务层

MySQL 中主要服务都集中在这个部分。

连接池(Connection Pool):负责存储和管理客户端与数据库的连接,一个线程池负责管理一个连接。

系统管理和控制工具组件(Management Service & Utilities):从备份和恢复的安全性、复制、集群、管理、配置、迁移和元数据等方面管理数据库。有

SQL接口组件(SQL Interface):用于接收客户端发送的各种 SQL 命令,并且返回用户需要查询的结果。比如 DML、DDL,存储过程、视图、触发器等操作和管理。

解析器组件(Parser):负责将请求的 SQL 解析生成一个 ”解析树“。然后根据一些 MySQL 规则进一步检查解析树是否合法。

查询优化器组件(Optimizer):当”解析树“通过解析器语法检查后,将交由优化器将其转化成执行计划,然后与存储引擎交互。

#根据性别查询用户的 id 和姓名。select uid,name from user where gender=1;

策略:选取 -> 投影 -> 连接

1)select 先根据 where 语句进行选举,而不是说一下子将表里面的数据全拿出来才进行过滤。

2)select 查询根据 uid 和 name 进行属性的投影,并不是取出所有字段。

3) 将两个查询条件连接起来最终生成查询结果。

缓存和缓冲区(Cache & Buffer):缓存机制是有一系列小缓存组成的。比如表缓存、记录缓存、权限缓存、引擎缓存等。如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。

可插拔存储引擎

MySQL的存储引擎是插件式的。它根据 MySQL AB 公司提供的文件访问层的一个抽象接口来定制一种文件访问机制,这种访问机制就叫存储引擎。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uL1dsavA-1609064903206)(G:\笔记\精讲 MySQL\img\image-20201129212340264.png)]

MyISAM:它查询速度快,有较好的索引优化和数据压缩技术。但是它不支持事务。、

InnoDB:MySQL 5.5 版本以后默认的存储引擎由于该存储引擎在事务上具有优势,即支持具有提交、回滚及崩溃恢复能力等事务特性,所以比 MyISAM 存储引擎占用更多的磁盘空间。因此当需要频繁的更新、删除操作,同时还对事务的完整性要求较高,需要实现并发控制,建议选择。

BDB:不再从底层支持BDB。

MEMORY:MEMORY存储引擎存储数据的位置是内存,因此访问速度最快,但是安全上没有保障。适合于需要快速的访问或临时表。

Archive:适合存储历史数据。

系统文件层

系统文件层主要的作用是将我们数据库中的数据和日志存储起来,完成与存储引擎的一个交互。它其实是我们文件的一个物理存储层,其中包含了一些日志文件,数据文件,另外还有一些配置文件、索引文件、慢查询等等。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i7rf0d1m-1609064903207)(G:\笔记\精讲 MySQL\img\image-20201129212709512.png)]

日志文件

错误日志文件(Error Log):错误日志文件记录了 MySQL 服务运行过程中遇到的所有严重的错误信息,以及 MySQL 每次启动和关闭的详细信息。当前我使用的 MySQL 版本默认情况下错误日志功能是开启的。

命令:

show variable like '%log_err%';

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vhMBV0nI-1609064903214)(G:\笔记\精讲 MySQL\img\image-20201130003752276.png)]

通用查询日志(General Query Log):记录所有的查询操作,包括所有的 select 操作信息,体积比较大,开启后对性能有较大的影响,当前我使用的 MySQL 版本默认情况下通用查询日志功能是关闭的。

命令:

show variable like '%general%';

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hztHFfz9-1609064903215)(G:\笔记\精讲 MySQL\img\image-20201130085350974.png)]

二进制日志(Binary Log):进制日志记录了 MySQL 所有修改数据库的操作,然后以 进制的形式记录在日志文件中,其中还包括每条语句所执行的时间和所消耗的资源,以及相关的事务信息。但是它不记录 select 、show 等不修改数据库的 SQL。主要用于数据库恢复和主从复制。当前我使用的 MySQL 版本默认情况下二进制日志文件功能是开启的。

命令:

show variables like '%log_bin%';

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tW6Z2jX0-1609064903216)(G:\笔记\精讲 MySQL\img\image-20201130090149983.png)]

参数查看,这个相对比较复杂些。

命令:

show variables like '%binlog%';

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UDyBaM2b-1609064903217)(G:\笔记\精讲 MySQL\img\image-20201130090720103.png)]

查看日志

命令:

show binary logs;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LKONxLLm-1609064903218)(G:\笔记\精讲 MySQL\img\image-20201130091046012.png)]

慢查询日志(Slow Query Log):指所有 SQL 执行的时间超过 long_query_ time 量的语句和达到min examined row limit 条距离的语句。默认是 10 秒。可以针对这部分语句性能调优。当前我使用的 MySQL 版本默认情况下慢查询日志功能是关闭的。

命令:

show variables like '%low_lquery%'; //查看是否超时

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v6EB6K9g-1609064903218)(G:\笔记\精讲 MySQL\img\image-20201130091440201.png)]

超时查看,查看超时时长。

命令:

show variables like '%long_query_time%';

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xaD8jzuF-1609064903219)(G:\笔记\精讲 MySQL\img\image-20201130091916895.png)]

配置文件

用于存放 MySQL 所有的配置信息文件,比如 my.conf、my.ini 等。

数据文件

db.opt 文件:记录这个库的默认使用的字符集和校验规则。

frm 文件:存储与表相关的元素(meta)信息,包括表的结构的定义信息等,每一张表都会有一个 frm 文件。

MYD 文件:MyISAM 存储引擎创建表时,每 MyISAM 类型的表都会有 个 .MYD 文件与之对应。.MYD 文件主要用来存放数据表的数据文件。

MYI 文件:MyISAM 存储引擎专用,存放 MyISAMy 表的索引相关信息,每一张 MyISAM 表对应一个 .MYI 文件。

ibd 文件和 ibdata 文件:存放 Innodb 的数据库文件(包括索引)。Innodb 存放引擎有两种表空间方式:独享表空间和共享表空间。独享表空间使用 .ibd 文件来存放数据,且每一张 Innodb 表对应一个 .ibd 文件。共享表空间使用 .ibdata 文件,所有表共同使用一个(或多个,自行配置).ibdata 文件。

ibdata1 文件:系统表空间数据文件,存储表元数据、Undo 等。

ib_logfile0、ib_logfile1 文件:Redo Log 日志文件。

其他文件

pid 文件:pid 文件是 mysqld 应用程序在 Unix/Linux 环境下的一个进程文件,和许多其他 Unix/Linux 服务器程序一样,它存放着自己的进程 id。

socket 文件:socket 文件也是在 Unix/Linux 环境下才有的,用户在 Unix/Linux 环境下客户端连接可以不通过 TCP/IP 网络协议而直接使用 Unix Socket 来连接 MySQL。

文件是 mysqld 应用程序在 Unix/Linux 环境下的一个进程文件,和许多其他 Unix/Linux 服务器程序一样,它存放着自己的进程 id。

socket 文件:socket 文件也是在 Unix/Linux 环境下才有的,用户在 Unix/Linux 环境下客户端连接可以不通过 TCP/IP 网络协议而直接使用 Unix Socket 来连接 MySQL。