news 2026/8/4 0:07:04

第三章 MySQL数据库的体系结构_上

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第三章 MySQL数据库的体系结构_上

第三章 MySQL数据库的体系结构_上

3.1、MySQL客户端服务器架构

客户端-服务器(Client/Server)结构简称 C/S 结构,是一种网络架构,通常在该网络架构下的软件分为客户端和服务器。MySQL是C/S架构的服务模式。
客户端和服务器程序通常不在同一台计算机上运行,比如,我们平时在当当网上买书的时候,所使用的电脑和网页浏览器就被当做了一个客户端,同时,组成当当网的电脑、数据库和应用程序就被当做服务器。
注意:客户端和服务器可以安装在两台计算机或一台计算机上,不管它们在不在相同的计算机上,客户端都要与服务器进行通信。

3.2、MySQL内部结构

MySQL 由连接池、SQL 接口、解析器、优化器、缓存、存储引擎等组成,可以分为三层,即 MySQL Server 层、存储引擎层和文件系统层。MySQL Server 层又包括连接层和 SQL 层。如下是官方文档中 MySQL 的基础架构图:

上图中,Connection pool 为连接层,Management Services & Utilities …Caches & Buffers 为 SQL 层,Pluggable Storage Engines 为存储引擎层,File system、Files & Logs 为文件系统层。Connectors 不属于以上任何一层,可以将 Connectors 理解为各种客户端、应用服务,主要指的是不同语言与 SQL 的交互。

3.2.1、连接层

应用程序通过接口(如 ODBC、JDBC)来连接 MySQL,最先连接处理的是连接层。连接层包括通信协议、线程处理、用户名密码认证 3 部分。
 通信协议负责检测客户端版本是否兼容 MySQL 服务端。
 线程处理是指每一个连接请求都会分配一个对应的线程,相当于一条 SQL 对应一个线程,一个线程对应一个逻辑 CPU,在多个逻辑 CPU 之间进行切换。
 密码认证用来验证用户创建的账号、密码,以及 host 主机授权是否可以连接到 MySQL 服务器。
Connection Pool(连接池)属于连接层。由于每次建立连接都需要消耗很多时间,连接池的作用就是将用户连接、用户名、密码、权限校验、线程处理等需要缓存的需求缓存下来,下次可以直接用已经建立好的连接,提升服务器性能。

3.2.2、SQL层

SQL 层是 MySQL 的核心,MySQL 的核心服务都是在这层实现的。主要包含权限判断、查询缓存、解析器、预处理、查询优化器、缓存和执行计划。
 权限判断可以审核用户有没有访问某个库、某个表,或者表里某行数据的权限。
 查询缓存通过 Query Cache 进行操作,如果数据在 Query Cache 中,则直接返回结果给客户端,不必再进行查询解析、优化和执行等过程。
 查询解析器针对 SQL 语句进行解析,判断语法是否正确。
 预处理器对解析器无法解析的语义进行处理。
 查询优化器对 SQL 进行改写和相应的优化,并生成最优的执行计划,就可以调用程序的 API 接口,通过存储引擎层访问数据。

Management Services & Utilities、SQL Interface、Parser、Optimizer 和 Caches & Buffers 属于 SQL 层,详细说明如下表所示。

3.2.3、存储引擎层

Pluggable Storage Engines 属于存储引擎层。存储引擎层是 MySQL 数据库区别于其他数据库最核心的一点,也是 MySQL 最具特色的一个地方。主要负责 MySQL 中数据的存储和提取。
因为在关系数据库中,数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)。

3.2.4、文件系统层

文件系统层主要是将数据库的数据存储在操作系统的文件系统之上,并完成与存储引擎的交互。

3.3、MySQL目录结构

MySQL 安装完成后,会在磁盘上生成一个目录,该目录就被称为 MySQL 的安装目录。
MySQL 5.7 版本的安装配置后,目录结构可能如下图所示:

3.3.1、MySQL目录介绍

1、bin目录
用于放置一些可执行脚本文件,也就是mysql的程序文件
2、data目录
data目录是mysql数据库的数据目录。可以在mysql shell下面通过全局变量查询mysql的数据目录

mysql>show variables like'%datadir%';

通过上图可知mysql数据库初始化位置是/.dataDB/mysql/data/
该目录的绝对路径信息必须与my.cn文件里面定义的目录位置保持一致。
data目录存放了mysql数据库系统初始化安装时候的一些相关文件:系统数据库、sock文件、表空间数据文件等
3、docs目录
mysql的文档存放目录,用于存放一些文档
4、include目录
用于放置一些头文件,如:mysql.h、mysql_ername.h 等
5、lib目录
用于存放mysql的一系列库文文件
6、man目录
用于存放mysqld命令帮助及相关的说明文档
7、share目录
用于存放mysql的字符集、语言文件目录
8、support-files目录
用户存放mysql数据库系统的服务器启动脚本。在需要将mysql注册为系统服务的时候,需要将该目录下面的启动脚本复制到”/etc/init.d/”下面。

3.3.2、MySQL数据(data)目录文件详解

在 MySQL 中,物理文件存放在数据目录中。数据目录与安装目录不同,安装目录用来存储控制服务器和客户端程序的命令,数据目录用来存储 MySQL 服务器在运行过程中产生的数据。本节主要介绍 MySQL 数据目录的物理结构和作用。
MySQL 中任何一项逻辑性或者物理性文件都具有可配置性,另外由于开源的原因,每个版本都有一些改进,所以我们在学习本节内容时要灵活掌握,不能生搬硬套。
如果你不知道 MySQL 的数据目录路径,可以通过SHOW VARIABLES LIKE ‘datadir’;命令查看。

mysql>show variables like'%datadir%';

Data 目录用来存放数据库相关的数据信息,包括数据库信息,表信息等。
MySQL 5.7 及之后的版本开始支持集群模式,installer_config.xml 配置文件主要用于配置单节点或集群模式。
my.ini 文件是 MySQL 服务端和客户端主要的配置文件,包括编码集、默认引擎、最大连接数等设置。MySQL 服务器启动时会默认加载此文件。
1、 MySQL data目录里面的文件
通过上图可以看出,data目录里面存放了系统数据库、用户自定义数据库,位置相同。而每个独立的数据库目录里面存放了相应的数据库对象文件。
如上图中红色 的椭圆形标记的为系统自动生成的一些系统数据库,红色方框标记的为用户自建的数据库。

data目录文件说明:
 系统自建数据库目录
mysql、performance_schema、information_schema、sys都是系统自建的数据库目录,是在数据库初始化完成创建的。每一个数据库对应一个系统存在的目录。
通过上图可以看出mysql系统自建的数据库有4个。但是information_schema数据库比较特殊,它没有对应的目录,所以我们在data目录下面只能看见3个对应的系统数据库目录,如下图所示:

 用户自建数据库目录
用户自建数据库目录是DBA为用户创建数据库以后,在mysql的数据目录里面会自动生成一个对应的数据目录。例如DBA给用户创建了数据库CMCC,那么在data录下就会生成一个对应的CMCC目录。

mysql>create database CMCC;mysql>show databases;



 服务器选项文件:auto.cnf
auto.cnf文件是MySQL 服务器的选项文件,用于存储 server-uuid 的值。server-uuid 与 server-id 一样,用于标识 MySQL 实例在集群中的唯一性。

 redo日志文件:ib_logfile0、ib_logfile1
ib_logfile0、ib_logfile1 是支持事务性引擎的 redo 日志文件

 表空间数据文件:ibdata1
ibdata1 为共享表空间(系统表空间),如下图所示:

如果采用 InnoDB 引擎,根据mysql的不同安装版本,该文件有一个默认大小,上图中显示ibdata1的大小为12M。该文件的最小值的设置取决于当前mysql页的设定大小,mysql页大小的设定确定了表空间数据文件最小值的设定要求。
我们通过以下方式查看当前mysql页大小的设定值:

mysql>show variables like'%innodb_page_size%';

从上图可以看出当前mysql页大小的设定为16k。页大小设定为16K,那么表空间数据库文件的最小值为3M

 临时对象文件:ibtmp1
ibtmp1为临时对象文件,为存储临时对象的空间,比如临时表对象等

 其他文件
mysql服务器的进程PID文件、mysql服务器的日志文件、mysql的sock文件、mysql的DES秘钥文件等

2、 用户自建数据目录里面的文件
当DBA为用户创建了数据库以后,会在data目录下面生成一个同名的目录。该目录存储了该数据库相关的一些文件。
 db.opt
用来保存数据库的配置信息,比如该库的默认字符集编码和字符集排序规则。如果你创建数据库时指定了字符集和排序规则,后续创建的表没有指定字符集和排序规则,那么该表将采用 db.opt 文件中指定的属性。
 .frm
在 MySQL 中建立任何一张数据表,其对应的数据库目录下都会有该表的同名的 .frm 文件。.frm文件用来保存每个数据表的元数据(meta)和表结构等信息。数据库崩溃时,可以用 .frm 文件恢复表结构。
.frm 文件跟存储引擎无关,任何存储引擎的数据表都有 .frm 文件,命名方式为表名.frm,如 users.frm。
例如在数据“CMCC”下面创建一个名为“salary_1”的表,那么该目录下面便会产生一个salary_1.frm文件。

✍注意事项:
MySQL 8.0 版本开始,frm 文件被取消,MySQL 把文件中的数据都写到了系统表空间。通过利用 InnoDB 存储引擎来实现表 DDL 语句操作的原子性(在之前版本中是无法实现表 DDL 语句操作的原子性的,如 TRUNCATE 无法回滚)。

 .ibd
对于innodb存储引擎的数据表,一个表对应连个两个文件,一个是.frm,用于存储表结构信息;一个是.ibd文件用于存储表中的数据。.ibd与.ibdata文件都专属Inodb存储引擎的表空间数据库文件。
当表空间模式为“独立表空间”时,那么每一个用户的数据库目录里面就会产生一个独立表空间数据文件“*.ibd“文件;
当表空间模式为“共享表空间”时,那么都有用户的数据都使用一个共同的表空间数据文件“ibddata”文件

当然,就算开启了独享表空间,ibdata 文件也会越来越大,因为这个文件里还存储了相依信息:
 变更缓冲区
 双写缓冲区
 撤销日志
✍注意事项:
关于mysql数据库系统的表空间模式,可用以下全局变量来查询当前数据库系统的表空间模式(独立表空间/共享表空间),以及表空间数据文件的大小、名称、自动扩展等信息。
innodb_file_per_table :表空间模式全局变量,当Value部分的值为on即是独立表空间模式,OFF即是共享表空间模式;
innodb_data_file_path :表空间数据文件初始参数变量,Value部分显示了数据文件的名称、大小、是否自动扩展、最大扩展的极限;
innodb_data_home_dir :表空间数据文件的目录,Value的值为空,则与初始化的时候的位置一支,可自定义目录位置;

 .MYD和.MYI
.MYD 理解为My Data,用于存放MyISAM表的数据
.MYI 理解为My Index,主要存放MyISAM表的索引即相关信息

3.4、MySQL主配置文件

3.4.1、主配文件来源

Linux 操作系统中 MySQL 的配置文件是 my.cnf,一般会放在 /etc/my.cnf 或 /etc/mysql/my.cnf 目录下。
✍注意事项
如果你使用 rpm 包安装 MySQL,找不到 my.cnf 文件,或者是my.cnf主配置文件搞丢失的时候。可以用以下方法解决:
rpm包安装mysql后,在“/usr/share/mysql/”目录下面会生成mysql主配置文件的模板文件,我们可以复制模板文件到/etc下面以此方式来恢复丢失的my.cnf主配置文件

3.4.1、主配文件变量值的设定

关于mysql所有参数的设定都可以使用my.fn主配置文件来设定,或者是通过变量参数来设置。二者的区别在于使用主配置文件myc.nf来设定的时候,需要重启mysqld服务,且设定的参数值永久生效;使用变量参数来设定的时候,不需要重启mysqd的服务,且是临时生效。

上述参数说明如下:
 user:mysqld 程序在启动后将在给定 UNIX/Linux 账户下执行。mysqld 必须从 root 账户启动才能在启动后切换到另一个账户下执行。mysqld_safe 脚本将默认使用 user=mysql 选项来启动 mysqld 程序。
 basedir:指定 MySQL 安装的绝对路径;
 datadir:指定 MySQL 数据存放的绝对路径;
 port:服务端口号,默认为 3306
 server-id:MySQL 服务的唯一编号,每个 MySQL 服务的 id 需唯一。
 socket:socket 文件所在目录

 character-set-server:数据库默认字符集,主流字符集支持一些特殊表情符号(特殊表情符占用 4 个字节)
 collation-server:数据库字符集对应一些排序等规则,注意要和 character-set-server 对应
 init_connect:设置 client 连接 mysql 时的字符集,防止乱码
 lower_case_table_names:是否对 sql 语句大小写敏感,1 表示不敏感
 key_buffer_size:用于指定索引缓冲区的大小
 max_allowed_packet:设置一次消息传输的最大值
 no-auto-rehash:仅仅允许使用键值的 UPDATES 和 DELETES
 sql_mode:表示 SQL 模式的参数,通过这个参数可以设置检验 SQL 语句的严格程度

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/21 6:15:59

解决 bedtools Segmentation fault (core dumped)

背景说明 粉丝的问题如下: 我使用 bedtools 将基因组坐标(bed 文件格式,如 chrX x1:x2)转换为基因组序列内容(fasta 文件格式,如 ‘ACGT…G’)。 bedtools 提取序列的命令格式为: bedtools getfasta -fi input_sequences.fa -bed genomic_coordinates.bed -fo outp…

作者头像 李华
网站建设 2026/7/21 6:15:39

HP8304@ACP#HP8304与MT3905参数对比

HP8304/HP8304F 与 MT3905 参数规格差异表表格核心参数HP8304/HP8304F(厚朴半导体)MT3905(M3TEK)拓扑结构同步降压 DC/DC,COT 恒定频率模式同步降压 DC/DC,PWM 模式输入电压范围4~32V(最大 36V…

作者头像 李华
网站建设 2026/7/21 6:15:42

Nature 软体机器人实时原位磁化重编程

磁性软体机器人凭借形状可编程性、高柔顺性和物理适应性,在生物医学、工业、海洋探索、搜索救援等场景中展现出巨大潜力,其变形与功能实现源于外部磁场与机器人固有磁化分布的相互作用。磁驱动是软体机器人在受限环境中操作的最优策略之一,但…

作者头像 李华
网站建设 2026/7/21 6:15:42

挂耳耳机最建议买的品牌有哪些?盘点最建议买的开放式耳机前十

现在市面上的挂耳耳机看着热闹,其实水挺深。很多网红款就是套个好看的壳子,戴上才知道多坑人——材质又硬又糙,夹得耳朵生疼;发声单元也偷工减料,声音糊成一团,听个响都嫌难受。更别说那些几十块的劣质货了…

作者头像 李华