Mysql--架构篇--体系结构(连接层,SQL层,存储引擎层,文件存储层)
MySQL是一种广泛使用的关系型数据库管理系统(RDBMS),其体系结构设计旨在提供高效的数据存储、查询处理和事务管理。MySQL的体系结构可以分为多个层次,每个层次负责不同的功能模块。
MySQL的体系结构主要由以下几个部分组成:(自上而下)
- 连接层
- SQL层
- 存储引擎层
- 文件系统层
体系结构示例:

1、连接层
连接层是MySQL服务器与客户端之间的桥梁,负责处理客户端的连接请求、身份验证、权限检查以及连接池管理等。
客户端连接器(Client Connectors):
提供与MySQL服务器建立连接的支持。目前几乎支持所有主流的服务器编程技术,例如常见的Java、C、Python、.NET等,它们通过各自的API技术与MySQL建立连接。
2、SQL层(或服务层)
SQL层是MySQL的核心部分,也称服务层(MySQL Server)。负责解析SQL查询、优化查询、执行查询操作并将结果返回给客户端。
SQL层的主要组件包括:
(1)、连接池(Connection Pool):MySQL提供了内置的连接池功能(从8.0版本开始),用于管理多个客户端连接。连接池可以减少频繁创建和销毁连接的开销,提升系统的并发处理能力。
(2)、系统管理和控制工具(Management Services & Utilities):用于备份恢复、安全管理、集群 管理等 。
(3)、SQL接口(SQL Interface):用于接收客户端发送的各种SQL命令,并且返回用户需要查询的结果。比如DML、DDL、存储过程、视图、触发器等。
(4)、解析器(Parser):解析器负责将SQL语句转换为内部的语法树结构。它会检查语法是否正确,并生成相应的执行计划。
(5)、查询优化器(Query Optimizer):查询优化器是SQL层的核心组件之一,负责选择最优的查询执行计划。优化器会根据表的统计信息(如索引、表大小、数据分布等)评估不同的执行路径,并选择最高效的方案。优化器的目标是减少I/O操作、降低CPU使用率,从而提高查询性能。
(6)、执行器(Executor):执行器根据优化器生成的执行计划,调用存储引擎层的接口来实际执行查询操作。执行器负责处理各种SQL操作,如SELECT、INSERT、UPDATE、DELETE等。
(7)、缓存(Cache&Buffer):缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,权限缓存,引擎缓存,索引缓存等。如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据,用于加速数据读取操作。注意:MySQL曾经提供了一个查询缓存功能(在8.0版本中已被移除),用于缓存查询结果。如果相同的查询再次执行,MySQL可以直接从缓存中返回结果,而不需要重新执行查询。虽然查询缓存可以提高某些场景下的性能,但在高并发写入的情况下,它的效果可能适得其反,因此在现代版本中已被移除。
3、存储引擎层(Pluggable Storage Engines)
存储引擎层是MySQL的关键组成部分,负责实际数据的存储与提取,与底层系统文件进行交互。MySQL支持多种存储引擎,每种存储引擎都有其独特的特性和适用场景。现在有很多种存储引擎,各有各的特点,最常见的是MyISAM和InnoDB。
常见的存储引擎包括:
(1)、InnoDB:默认存储引擎,支持事务、外键约束、行级锁和崩溃恢复。InnoDB是大多数生产环境的首选,特别适用于需要高并发写入和事务安全的场景。
(2)、MyISAM:早期MySQL的默认存储引擎,不支持事务和行级锁,但具有较高的读取性能。MyISAM适合只读或读多写少的场景,但由于其缺乏事务支持,现在已较少使用。
(3)、Memory:将数据存储在内存中,适用于临时表或需要快速读写的场景。由于数据存储在内存中,重启后数据会丢失,因此不适合持久化存储。
(4)、NDB Cluster:用于分布式集群的存储引擎,支持高可用性和水平扩展。NDB Cluster通过分片技术将数据分布在多个节点上,适合需要处理大规模数据集和高并发访问的场景。
(5)、Archive:专门用于归档数据的存储引擎,适合存储大量历史数据。Archive引擎压缩数据,节省存储空间,但写入性能较低,适合只写或很少读取的场景。
(6)、CSV:将数据存储为CSV文件格式,适合与外部应用程序进行数据交换。CSV引擎不支持索引和复杂的查询操作,主要用于数据导入和导出。
4、文件存储层
该层负责将数据库的数据和日志存储在文件磁盘上,并完成与存储引擎的交互,是文件的物理存储层。主要包含日志文件,数据文件,配置文件,pid文件,socket文件等。
不同存储引擎对文件系统的使用方式有所不同:
(1)、InnoDB
InnoDB使用独立的表空间文件(.ibd)来存储每个表的数据和索引。此外,InnoDB 还维护一个共享表空间文件(ibdata1),用于存储系统表、回滚段、双写缓冲区等元数据。InnoDB还有独立的重做日志文件(redo log)和撤销日志文件(undo log),用于实现事务的持久性和崩溃恢复。

(2)、MyISAM
MyISAM使用三个文件来存储每个表的数据:
- .frm文件:存储表的元数据(如表结构、字段定义等)。
- .MYD文件:存储表的数据。
- .MYI文件:存储表的索引。
其他相关文件说明:
db.opt文件:记录这个库的默认使用的字符集和校验规则。
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。
乘风破浪会有时,直挂云帆济沧海!!!
相关文章:
Mysql--架构篇--体系结构(连接层,SQL层,存储引擎层,文件存储层)
MySQL是一种广泛使用的关系型数据库管理系统(RDBMS),其体系结构设计旨在提供高效的数据存储、查询处理和事务管理。MySQL的体系结构可以分为多个层次,每个层次负责不同的功能模块。 MySQL的体系结构主要由以下几个部分组成&#…...
【0x005B】HCI_Write_Default_Erroneous_Data_Reporting命令详解
目录 一、命令概述 二、命令格式及参数 2.1. HCI_Write_Default_Erroneous_Data_Reporting命令格式 2.2. Erroneous_Data_Reporting 三、生成事件及参数 3.1. HCI_Command_Complete事件 3.2. 状态码(Status) 四、命令执行流程 4.1. 命令发起阶段(主机端) 4.2. 命…...
基于 Python 的学生成绩管理系统设计与实现
标题:基于 Python 的学生成绩管理系统设计与实现 内容:1.摘要 摘要:本文介绍了一个基于 Python 的学生成绩管理系统的设计与实现。该系统旨在提高学生成绩管理的效率和准确性,方便教师和学生进行成绩查询和分析。本文详细描述了系统的设计思路、功能模块…...
【Apache Doris】周FAQ集锦:第 29 期
引言 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目! 在这个栏目中,每周将筛选社区反馈的热门问题和话题,重点回答并进行深入探讨。旨在为广大用户和开发者分享有关 Apache Doris 的常见问题。 通过这个每周 FAQ 栏目,希望帮助社…...
【C】初阶数据结构3 -- 单链表
之前在顺序表那一篇文章中,提到顺序表具有的缺点,比如头插,头删时间复杂度为O(n),realloc增容有消耗等。而在链表中,这些问题将得到解决。所以在这一篇文章里,我们将会讲解链表的定义与性质,以及…...
Autodl安装tensorflow2.10.0记录
首先租用新实例(我选的是3080*2卡),由于基础镜像中没有2.10.0版本,选miniconda3的基础环境 创建虚拟环境:conda create --name xxx python3.8(环境名)激活虚拟环境:conda activate x…...
【Rust】常见集合
目录 思维导图 一、Rust常用集合 1. Rust标准库中的集合概述 2. 常用集合类型 2.1 向量(Vector) 2.2 字符串(String) 2.3 哈希映射(Hash Map) 二、向量(Vec) 1. 向量的概述…...
SpiderFlow平台v0.5.0之引入selenium插件
引入selenium插件 首先到码云下载插件点击下载编辑到本地并导入到工作空间或安装到maven库在spider-flow/spider-flow-web/pom.xml中引入插件 <!-- 引入selenium插件 --> <dependency><groupId>org.spiderflow</groupId><artifactId>spider-…...
git push命令
git push 常用命令 1. 拉取远程仓库最新数据 使用 git fetch git fetch作用: 获取远程仓库的最新数据(包括分支、标签等),但不会修改本地工作目录。 结果: 仅更新远程分支(如 origin/main)的…...
洛谷P1161
开灯 - 洛谷 代码区: #include<stdio.h> int ans[2000005]{1}; //1为关 int main(){int n;scanf("%d",&n);double arry[n][2];//此处最好用双精度浮点数,单精度浮点数的精确度够高对于此题来说,第一次没全对就是因为精度…...
Python脚本自动发送电子邮件
要编写一个Python脚本来自动发送电子邮件,你可以使用smtplib库来处理SMTP协议,以及email库来构建邮件内容。 安装必要的库 通常情况下,smtplib和email库是Python标准库的一部分,因此不需要额外安装。如果你使用的是较旧的Python版…...
vscode的安装与使用
下载 地址:https://code.visualstudio.com/ 安装 修改安装路径(不要有中文) 点击下一步,创建桌面快捷方式,等待安装 安装中文插件 可以根据自己的需要安装python和Jupyter插件...
sparkRDD教程之必会的题目
1.前期准备 (1)看看上一期的博客,最好跟着上一期的博客把sparkRDD的基本命令给熟练掌握后,再来做这篇文章的任务。 上一期的博客:sparkRDD教程之基本命令-CSDN博客 (2)新建文件task6.scala …...
Unity 2d描边基于SpriteRender,高性能的描边解决方案
目标 以Unity默认渲染管线为例,打造不需要图片内边距,描边平滑,高性能的描边解决方案 前言 在2d游戏中经常需要给2d对象添加描边,来突出强调2d对象 当你去网上查找2d描边shader,移植到项目里面,大概率会…...
信凯科技业绩波动明显:毛利率远弱行业,资产负债率偏高
《港湾商业观察》施子夫 1月8日,深交所官网显示,浙江信凯科技集团股份有限公司(以下简称“信凯科技”)主板IPO提交注册。 自2022年递交上市申请,信凯科技的IPO之路已走过两年光景,尽管提交注册࿰…...
js基础---var与let的区别以及const的使用
js基础—var与let的区别以及const的使用 var与let的区别 在较旧的JavaScript,使用关键字var来声明变量,而不是let。var现在开发中一般不再使用它,只是我们可能再老版程序中看到它。let的出现为了解决var的一些问题。 var 声明存在以下三种问…...
用css和html制作太极图
目录 css相关参数介绍 边距 边框 伪元素选择器 太极图案例实现、 代码 效果 css相关参数介绍 边距 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>*{margin: 0;padding: 0;}div{width: …...
OJ12:160. 相交链表
目录 题目思路分析代码展示 题目 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 示例 1: 输入:intersectVal 8, listA [4,1,8,4,5], listB [5,…...
软件工程和项目管理领域 - CMMI 极简理解
CMMI 概述 CMMI 全称为 Capability Maturity Model Integration,即能力成熟度模型集成 CMMI 是由美国卡内基梅隆大学软件工程研究所(SEI)开发的一套综合性管理模型 CMMI 是一种用于评估和改进组织在软件开发和维护方面过程能力的国际标准 …...
C# 线程基础之 线程同步
线程同步的手段很多 lock 是通过内存索引块 0 1 切换 进行互斥的实现 互斥量 信号量 事件消息 其实意思就是 一个 标记量 通过这个标记 来进行类似的互斥手段 具体方式的分析 代码在后 1.互斥量 Mutex 作用 非常类似lock 一个Mutex 名称来代替 lock的引用对象 2.信号量 Semaph…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
DiscuzX3.5发帖json api
参考文章:PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下,适配我自己的需求 有一个站点存在多个采集站,我想通过主站拿标题,采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...
