写点什么

一文搞懂 MySQL 体系架构!!

用户头像
冰河
关注
发布于: 2021 年 04 月 13 日
一文搞懂MySQL体系架构!!

写在前面

很多小伙伴工作很长时间了,对于 MySQL 的掌握程度却仅仅停留在表面的 CRUD,对于 MySQL 深层次的原理和技术知识了解的少之又少,随着工作年限的不断增长,职场竞争力却是不断降低的。很多时候,出去面试时,被面试官吊打的现象成了家常便饭。比如,对于 MySQL 的高频面试题有:


  • 说说 MySQL 中 MVCC 机制的原理?

  • MySQL 的事务原理和实现?

  • MySQL 数据主从复制的原理?

  • MySQL 底层数据的存储结构?

  • 如何使 MySQL 支持海量数据存储?

  • MySQL 中的锁机制原理和实现?

  • MySQL 索引机制?索引中涉及的数据结构和算法?

  • MySQL 为何使用 B+树作为索引结构?

  • B+树可以存放多少数据?

  • 说说 MySQL 中间隙锁的实现原理?

  • InnoDB 引擎为何会崩溃?说说其实现原理?

  • 等等其他一系列高频面试


如果一一列举的话,大概能够列举上百个关于 MySQL 的高频面试题,这些你都会吗?


不仅仅是面试,如果你想从一名底层程序员上升为高级工程师,架构师等,MySQL 的底层原理和技术是你必须要掌握的。


注:冰河后续会不定时连载 MySQL 底层原理和技术的文章,与小伙伴们一起死磕 MySQL,将冰河掌握的 MySQL 底层技术分享给大家,在面试时吊打面试官,在工作中吊打其他小伙伴。

MySQL 体系架构

我们先来看看 MySQL 的体系架构图,如下所示。



从 MySQL 的架构图,我们可以看出 MySQL 的架构自顶向下大致可以分为网络连接层、数据库服务层、存储引擎层和系统文件层四大部分。接下来,我们就来简单说说每个部分的组成信息。

网络连接层

网络连接层位于整个 MySQL 体系架构的最上层,主要担任客户端连接器的角色。提供与 MySQL 服务器建立连接的能力,几乎支持所有主流的服务端语言,例如:Java、C、C++、Python 等,各语言都是通过各自的 API 接口与 MySQL 建立连接。

数据库服务层

数据库服务层是整个数据库服务器的核心,主要包括了系统管理和控制工具、连接池、SQL 接口、解析器、查询优化器和缓存等部分。

连接池

主要负责存储和管理客户端与数据库的连接信息,连接池里的一个线程负责管理一个客户端到数据库的连接信息。

系统管理和控制工具

提供数据库系统的管理和控制功能,例如对数据库中的数据进行备份和恢复,保证整个数据库的安全性,提供安全管理,对整个数据库的集群进行协调和管理等。

SQL 接口

主要负责接收客户端发送过来的各种 SQL 命令,并将 SQL 命令发送到其他部分,并接收其他部分返回的结果数据,将结果数据返回给客户端。

解析树

主要负责对请求的 SQL 解析成一棵“解析树”,然后根据 MySQL 中的一些规则对“解析树”做进一步的语法验证,确认其是否合法。

查询优化器

在 MySQL 中,如果“解析树”通过了解析器的语法检查,此时就会由优化器将其转化为执行计划,然后与存储引擎进行交互,通过存储引擎与底层的数据文件进行交互。

缓存

MySQL 的缓存是由一系列的小缓存组成的。例如:MySQL 的表缓存,记录缓存,MySQL 中的权限缓存,引擎缓存等。MySQL 中的缓存能够提高数据的查询性能,如果查询的结果能够命中缓存,则 MySQL 会直接返回缓存中的结果信息。

存储引擎层

MySQL 中的存储引擎层主要负责数据的写入和读取,与底层的文件进行交互。值得一提的是,MySQL 中的存储引擎是插件式的,服务器中的查询执行引擎通过相关的接口与存储引擎进行通信,同时,接口屏蔽了不同存储引擎之间的差异。MySQL 中,最常用的存储引擎就是 InnoDB 和 MyISAM。


InnoDB 和 MyISAM 存储引擎需要小伙伴们重点掌握,高频面试考点,也是成为架构师必知必会的内容。

系统文件层

系统文件层主要包括 MySQL 中存储数据的底层文件,与上层的存储引擎进行交互,是文件的物理存储层。其存储的文件主要有:日志文件、数据文件、配置文件、MySQL 的进行 pid 文件和 socket 文件等。

日志文件

MySQL 中的日志主要包括:错误日志、通用查询日志、二进制日志、慢查询日志等。


  • 错误日志


主要存储的是 MySQL 运行过程中产生的错误信息。可以使用下面的 SQL 语句来查看 MySQL 中的错误日志。


show variables like '%log_error%';
复制代码


  • 通用查询日志


主要记录 MySQL 运行过程中的一般查询信息,可以使用下面的 SQL 语句来查看 MySQL 中的通用查询日志文件。


show variables like '%general%';
复制代码


  • 二进制日志


主要记录对 MySQL 数据库执行的插入、修改和删除操作,并且也会记录 SQL 语句执行的时间、执行的时长,但是二进制日志不记录 select、show 等不修改数据库的 SQL。主要用于恢复数据库的数据和实现 MySQL 主从复制。


查看二进制日志是否开启。


show variables like '%log_bin%';
复制代码


查看二进制日志的参数


show variables like '%binlog%'
复制代码


查看日志文件


show binary logs;
复制代码


  • 慢查询日志


慢查询主要记录的是执行时间超过指定时间的 SQL 语句,这个时间默认是 10 秒。


查看是否开启慢查询日志


show variables like '%slow_query%';
复制代码


查看慢查询设置的时长


show variables like '%long_query_time%'
复制代码

数据文件

数据文件中主要包括了:db.opt 文件、frm 文件、MYD 文件、MYI 文件、ibd 文件、ibdata 文件、ibdata1 文件、ib_logfile0 和 ib_logfile1 文件等。


  • db.opt 文件


主要记录当前数据库使用的字符集和检验规则等信息。


  • frm 文件


存储数据表的结构信息,主要是数据表相关的元数据信息,包括数据表的表结构定义信息,每张表都会有一个 frm 文件。


值得注意的是:MySQL8 版本中的 innodb 存储引擎的表没有 frm 文件。(后面专门写一些 MySQL8 新特性的文章,从使用到底层原理与 MySQL5 到底有何不同)。


  • MYD 文件


MyISAM 存储引擎专用的文件格式,主要存放 MyISAM 存储引擎数据表中的数据,每张 MyISAM 存储引擎表对应一个.MYD 文件。


  • MYI 文件


MyISAM 存储引擎专用的文件格式,主要存放与 MyISAM 存储引擎数据表相关的索引信息,每张 MyISAM 存储引擎表对应一个.MYI 文件。


  • ibd 文件


存放 Innodb 存储引擎的数据文件和索引文件,主要存放的是独享表空间的数据和索引,每张表对应一个.ibd 文件。


  • ibdata 文件


存放 Innodb 存储引擎的数据文件和索引文件,主要存放的是共享表空间的数据和索引,所有表共用一个(或者多个).ibdata 文件,可以根据配置来指定共用的.ibdata 文件个数。


  • ibdata1 文件


MySQL 的系统表空间数据文件,主要存储 MySQL 的数据表元数据、Undo 日志等信息。


  • ib_logfile0 和 ib_logfile1 文件


MySQL 数据库中的 Redo log 文件,主要用于 MySQL 实现事务的持久性。如果在某个时间点 MySQL 发生了故障,此时如果有脏页没有写入到数据库的 ibd 文件中,在重启 MySQL 的时候,MySQL 会根据 Redo Log 信息进行重做,将写入 Redo Log 并且尚未写入数据表的数据进行持久化操作。

配置文件

用于存在 MySQL 所有的配置信息,在 Unix/Linux 环境中是 my,cnf 文件,在 Windows 环境中是 my.ini 文件。

pid 文件

pid 文件是存放 MySQL 进程运行时的进程号的文件,主要存在于 Unix/Linux 环境中,具体的存储目录可以在 my.cnf 或者 my.ini 文件中进行配置。

socket 文件

socket 文件和 pid 文件一样,都是 MySQL 在 Unix/Linux 环境中运行才会有的文件。在 Unix/Linux 环境中,客户端可以直接通过 socket 来连接 MySQL。


肝不动了,原创不易,小伙伴们点个赞,给个在看和转发吧


好了,今天就到这儿吧,我是冰河,大家有啥问题可以在下方留言,也可以加我微信:sun_shine_lyz,我拉你进群,一起交流技术,一起进阶,一起牛逼~~

发布于: 2021 年 04 月 13 日阅读数: 144
用户头像

冰河

关注

公众号:冰河技术 2020.05.29 加入

Mykit系列开源框架发起者、核心架构师和开发者,《海量数据处理与大数据技术实战》与《MySQL开发、优化与运维实战》作者。【冰河技术】微信公众号作者。

评论

发布
暂无评论
一文搞懂MySQL体系架构!!