一文搞懂 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 中的错误日志。
通用查询日志
主要记录 MySQL 运行过程中的一般查询信息,可以使用下面的 SQL 语句来查看 MySQL 中的通用查询日志文件。
二进制日志
主要记录对 MySQL 数据库执行的插入、修改和删除操作,并且也会记录 SQL 语句执行的时间、执行的时长,但是二进制日志不记录 select、show 等不修改数据库的 SQL。主要用于恢复数据库的数据和实现 MySQL 主从复制。
查看二进制日志是否开启。
查看二进制日志的参数
查看日志文件
慢查询日志
慢查询主要记录的是执行时间超过指定时间的 SQL 语句,这个时间默认是 10 秒。
查看是否开启慢查询日志
查看慢查询设置的时长
数据文件
数据文件中主要包括了: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,我拉你进群,一起交流技术,一起进阶,一起牛逼~~
版权声明: 本文为 InfoQ 作者【冰河】的原创文章。
原文链接:【http://xie.infoq.cn/article/780d80ecf3458f951975953fb】。文章转载请联系作者。
评论