Mysql架构解析,InnoDB架构概述。
MySQL架构解析
Mysql整体架构
MySQL整体架构如下图所示:
MySQL逻辑系统架构分为4层:
- 应用层
- MySQL服务层
- 存储引擎层
- 系统文件层
下面将对各层的功能和组件进行介绍,并探讨一条语句的执行过程。
应用层
应用层是MySQL体系架构的最上层,它处理与客户端的交互,主要包含连接处理、用户鉴权和安全管理。
- 连接处理:负责管理客户端与MySQL服务器之间的连接。它管理连接的建立、维护和关闭,并分配和释放连接资源以提高性能和可扩展性。
- 用户鉴权:用于验证客户端的身份。MySQL支持多种身份验证方法,如基于用户名和密码的验证、SSL/TLS证书验证等,以提高数据的安全性。
- 安全管理:涉及访问控制、权限管理和数据加密等措施。它定义用户的权限和访问级别,并防止未经授权的访问、网络攻击和数据泄露。
MySQL 服务层
该层是MySQL Server的核心层,提供了MySQL Server数据库系统的所有逻辑功能,该层可以分为如下不同的组件:
- NoSQL Interface(NoSQL 接口)
- SQL Interface(SQL 接口)
- SQL Parser(SQL 解析器)
- Optimizer (查询优化器)
- Caches & buffers(缓存)
-
NoSQL Interface(NoSQL 接口):通过NoSQL接口,MySQL Server可以像操作关系型数据一样操作非结构化数据,而不需要遵循传统的表格和列的模式。
-
SQL Interface(SQL 接口) SQL接口,接收用户的SQL命令并进行处理,得到用户所需要的结果,具体处理功能如下:
- Data Manipulation Language (DML).
- Data Definition Language (DDL).
- 存储过程
- 视图
- 触发器
-
SQL Parser(SQL 解析器) 解析器的作用主要是解析查询语句,最终生成语法树。首先解析器会对查询语句进行语法分析,如果语句语法有错误,则返回相应的错误信息。语法检查通过后,解析器会查询缓存,如果缓存中有对应的语句,就直接返回结果不进行接下来的优化执行操作。
-
Optimizer(查询优化器) 优化器的作用主要是对查询语句进行优化,包括选择合适的索引,数据的读取方式。
-
Caches & buffers(缓存) 包括全局和引擎特定的缓存,提高查询的效率。如果查询缓存中有命中的查询结果,则查询语句就可以从缓存中取数据,无须再通过解析和执行。这个缓存机制是由一系列小缓存组成,如表缓存、记录缓存、key缓存、权限缓存等。查询缓存默认是关闭的,可以通过
set query_cache_type=1
开启。
存储引擎层
存储引擎是MySQL中具体与文件打交道的子系统,也是MySQL最有特色的地方。MySQL区别于其他数据库的最重要特点是其插件式的表存储引擎。常用的四种存储引擎分别是:
- MyISAM存储引擎
- innoDB存储引擎
- MEMORY存储引擎
- ARCHIVE存储引擎
MySQL将这些存储引擎提供为可插拔的,可以在表级别使用各种存储引擎。一个数据库可以包含使用多个存储引擎的表。"SHOW ENGINES"命令将列出服务器支持的所有存储引擎。
mysql>SHOW ENGINES;
几种存储引擎的对比:
功能 | MYISAM | Memory | InnoDB | Archive |
---|---|---|---|---|
存储限制 | 256TB | RAM | 64TB | None |
支持事物 | No | No | Yes | No |
支持全文索引 | Yes | No | No | No |
支持数索引 | Yes | Yes | Yes | No |
支持哈希索引 | No | Yes | No | No |
支持数据缓存 | No | N/A | Yes | No |
支持外键 | No | No | Yes | No |
InnoDB:支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。
MyISAM:插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比 较低,也可以使用。如果数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率
MEMORY:所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果
Archive:如果只有INSERT和SELECT操作,可以选择Archive,Archive支持高并发的插入操作,但是本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可以使用。
注意,同一个数据库也可以使用多种存储引擎的表。如果一个表要求比较高的事务处理,可以选择InnoDB。这个数据库中可以将查询要求比较高的表选择MyISAM存储。如果该数据库需要一个用于查询的临时表,可以选择MEMORY存储引擎。
物理文件层
物理文件包括:redolog、undolog、binlog、errorlog、querylog、slowlog、data、index等 MySQL的物理文件层包括以下文件:
- Redo log:用于事务的持久性和故障恢复,确保在发生故障时数据的一致性。
- Undo log:存储撤消日志,支持事务的回滚和多版本并发控制。
- Binlog:二进制日志,用于主从复制和数据恢复。
- 数据文件:存储表的数据和索引,不同存储引擎使用不同的数据文件格式。
- 表定义文件:存储表的元数据信息,包括表结构、字段定义、索引信息等。
- 参数文件:用于配置MySQL服务器的参数和选项。
- 锁文件:记录正在使用的表的锁信息。
- 错误日志文件:记录MySQL服务器的错误和警告信息。
- 查询日志文件:记录MySQL服务器接收到的查询语句。
- 慢查询日志文件:记录执行时间超过阈值的查询语句。
- 临时文件:存储临时数据和排序操作的中间结果。
- 其他日志文件:包括日志文件组合、日志索引文件等。
这些物理文件在MySQL中起着不同的作用,支持数据库的正常运行、故障恢复、备份和数据复制等功能。 需要注意的是,MySQL的物理文件层是存储引擎特定的,不同存储引擎可能使用不同的文件格式和组织方式。因此,具体的文件类型和文件组织方式可能因存储引擎而异。
一条语句的执行过程
结合整体架构,一条语句的执行过程如下所示:
InnoDB架构概述:
整体架构
通过Mysql架构解析我们了解了MySQL架构,下面我们看下Innodb架构。
innodb最早由Innobase Oy公司开发,5.5版本开始是MySQL默认存储引擎,该存储引擎是第一个完整支持ACID事务的MySQL存储引擎(BDB是第一个支持事务的MySQL存储引擎,现在已经停止开发),其特点是行锁设计、支持MVCC、支持外键、提供一致性非锁定读,同时被设计用来最有效地利用以及使用内存和CPU。下面我们详细看下innodb架构:
内存架构
-
Buffer Pool(缓冲池)是InnoDB存储引擎中的一个重要组件,用于高效地缓存数据库中的数据页。它是内存中的一块区域,用于存储从磁盘读取的数据页,以加快数据的访问速度。在专用服务器上,通常将物理内存的最多80%分配给缓冲池。
当InnoDB需要读取数据页时,首先会在缓冲池中查找该页是否已经被缓存。如果该页已经在缓冲池中,InnoDB可以直接从内存中获取数据,避免了磁盘IO的开销,从而提高数据访问的速度。如果该页不在缓冲池中,InnoDB会将其读取到缓冲池中,并进行相应的缓存管理。
Buffer Pool的大小是通过配置参数
innodb_buffer_pool_size
来指定的。较大的缓冲池可以容纳更多的数据页,提供更好的缓存效果,从而减少磁盘IO操作。合理配置缓冲池的大小对于数据库的性能至关重要,它应该根据数据库的大小、可用内存和访问模式来进行调整。Buffer Pool的作用在于:
- 提高数据访问性能:通过缓存数据页,减少磁盘IO,加快数据的读取速度。
- 减少磁盘访问:由于数据页已经在内存中,可以减少频繁的磁盘读取操作,降低IO开销。
- 优化查询性能:对于频繁访问的数据,可以直接从缓冲池中获取,减少查询的响应时间。
-
Change Buffer
-
Change Buffer是一种特殊的数据结构,用于在次要索引页不在缓冲池中时缓存对其进行的更改。这些缓冲的更改可能来自于插入(INSERT)、更新(UPDATE)或删除(DELETE)操作(DML),它们在后续的读操作将这些页加载到缓冲池时被合并。Change Buffer的目的是降低写操作的磁盘IO,提升数据库性能。
-
Log Buffer 当在MySQL中对InnoDB表进行更改时,这些更改首先存储在InnoDB日志缓冲区的内存中(Log Buffer),然后写入通常称为重做日志(redo logs)的InnoDB日志文件中。 日志缓冲区的大小由
innodb_log_buffer_size
变量定义,其默认大小为16MB。日志缓冲区的内容会定期刷新到磁盘。较大的日志缓冲区可以使大型事务在提交之前无需将重做日志数据写入磁盘,从而提供更好的性能。因此,如果存在更新、插入或删除大量行的事务,则增加日志缓冲区的大小可以减少磁盘IO操作。innodb_flush_log_at_trx_commit
变量控制日志缓冲区的内容如何写入和刷新到磁盘。innodb_flush_log_at_timeout
变量控制日志刷新的频率。
磁盘架构
InnoDB存储引擎使用页作为基本单位来管理存储空间,每个页的默认大小为16KB。对于每个索引,InnoDB使用B+树结构,其中每个节点都是一个数据页。数据页之间不必连续存储,而是通过双向链表来维护它们的顺序。
InnoDB的聚簇索引将完整的用户记录存储在叶子节点中,也就是说索引即数据,数据即索引。
为了更好地管理这些页,InnoDB引入了表空间(Tablespace)的概念。表空间是一个抽象的概念,可以对应于一个或多个实际的文件。每个表空间可以被划分为多个页,表的数据存放在特定表空间下的一些页中。 InnoDB将表空间划分为几种不同的类型:
-
系统表空间(System Tablespace):系统表空间可以对应文件系统上一个或多个实际的文件,默认情况下,InnoDB会在数据目录下创建一个名为ibdata1的文件,这个文件就是对应的系统表空间在文件系统上的表示。这个文件是自扩展文件,当不够用的时候它会自己增加文件大小。也可以把系统表空间对应的文件路径不配置到数据目录下,甚至可以配置到单独的磁盘分区上,涉及到的启动参数就是
innodb_data_file_path
和innodb_data_home_dir
。需要注意的一点是,在一个MySQL服务器中,系统表空间只有一份。 -
独立表空间(File-per-table Tablespace):在MySQL5.6.6以及之后的版本中,InnoDB并不会默认的把各个表的数据存储到系统表空间中,而是为每一个表建立一个独立表空间,也就是说我们创建了多少个表,就有多少个独立表空间。使用独立表空间来存储表数据的话,会在该表所属数据库对应的子目录下创建一个表示该独立表空间的文件,文件名和表名相同,只不过添加了一个.ibd的扩展名。我们也可以自己指定使用系统表空间还是独立表空间来存储数据,这个功能由启动参数
innodb_file_per_table
控制。 -
通用表空间(General Tablespace): 通用表空间是MySQL 8中引入的新特性,它允许将多个表存储在一个表空间中。通用表空间可以跨数据库和服务器共享,提供了更高的灵活性和资源利用率。
-
临时表空间(Temporary Tablespaces): 临时表空间用于存储临时表和临时文件。当执行排序、连接和其他需要临时存储的操作时,InnoDB会使用临时表空间来存储相关数据。
此外,InnoDB还使用其他文件和机制来支持数据管理和恢复:
-
双写缓冲文件(Doublewrite Buffer Files): 双写缓冲是一种机制,用于提高数据写入的可靠性。InnoDB将数据页首先写入双写缓冲文件中,然后再将其写入实际的数据文件。这样可以在发生故障时,通过双写缓冲文件恢复数据的一致性。
-
Undo表空间(Undo Tablespaces): 撤消表空间用于存储撤消日志(undo log),用于支持事务的回滚和MVCC(多版本并发控制)。每个事务对数据的修改都会生成相应的撤消日志,这些日志被存储在撤消表空间中。
-
重做日志(Redo Log): 重做日志是用于事务的持久性和故障恢复的重要组件。它记录了事务对数据的修改操作,包括插入、更新和删除。重做日志文件存储在磁盘上,并在事务提交时进行持久化。
这些组件和机制共同构成了InnoDB的磁盘架构,用于管理和存储数据。
相关文章:

Mysql架构解析,InnoDB架构概述。
MySQL架构解析 Mysql整体架构 MySQL整体架构如下图所示: MySQL逻辑系统架构分为4层: 应用层MySQL服务层存储引擎层系统文件层 下面将对各层的功能和组件进行介绍,并探讨一条语句的执行过程。 应用层 应用层是MySQL体系架构的最上层,它…...

jmeter如何测试websocket接口?
jmeter做接口测试,很多人都是做http协议的接口,就有很多人问websocket的接口怎么测试啊? 首先,我们要明白,websocket接口是什么接口。 然后,我们怎么用jmeter测试? jmeter要测试websocket接口…...

15 Transformer 框架概述
整体框架 机器翻译流程(Transformer) 通过机器翻译来做解释 给一个输入,给出一个输出(输出是输入的翻译的结果) “我是一个学生” --》(通过 Transformer) I am a student 流程 1 编码器和解…...

[架构之路-241]:目标系统 - 纵向分层 - 企业信息化与企业信息系统(多台企业应用单机组成的企业信息网络)
目录 前言: 一、什么是信息系统:计算机软件硬件系统 1.1 什么是信息 1.2 什么是信息系统 1.3 什么是信息技术 1.4 什么是信息化与信息化转型 1.5 什么是数字化与数字化转型(信息化的前提) 1.6 数字化与信息化的比较 1.7 …...
flink中使用异步函数的几个注意事项
背景 在flink系统中,我们为了补充某个流事件成一个完整的记录,经常需要调用外部接口获取一些配置数据,流事件结合这些配置数据就可以组合成一条完整的记录,然而如果同步调用外部系统接口来实现,那么会有很大的性能瓶颈…...

QML之Repeater 控件使用
Repeater 控件是 重复作用 根据 model中的index 数量进行重复 废话不说 直接看如何用 当model 为数字时 Rectangle{height: 1200width: 500visible: trueanchors.fill: parentColumn{spacing: 20Repeater{model: 10delegate: Rectangle{width: 60height: 20color: index%2 …...
哈希树讲解
哈希树(HashTree)是哈希(Hash)算法的一种延续。传统数据结构中对如何避免哈希冲突都有一定的描述和解释,但是这些描述和解释都是泛泛而谈,并没有提出比较好的解决方案。这里所提到的哈希树(HashTree)算法就是要提供一种在理论上和实际应用中均能有效地处…...
vue 项目启动后一直不断的刷新停不下来
新建的vue 项目,配置了代理后项目一直刷新,停不下来,各种查找最后发现是vue.config.js 中的热更新配置项目开启的原因 const {defineConfig } require(vue/cli-service) const AutoImport require(unplugin-auto-import/webpack) const Co…...

makesense在线yolov5标注
文章目录 一、创建图片文件夹和label.txt二、在线标注数据 参考文章博主:风吹落叶花飘荡 一、创建图片文件夹和label.txt 创建一个放置图片的文件夹images,存放需要标注的图片(图片最好重命名为1,2,3…避免后面混淆) 创建label.t…...

python 之 矩阵相关操作
文章目录 1. **创建矩阵**:2. **矩阵加法**:3. **矩阵乘法**:4. **矩阵转置**:5. **元素级操作**:6. **汇总统计**:7. **逻辑操作**: 理解你的需求,我将为每个功能写一个单独的代码块…...
敢问路在何方
从2022年进入软件行业到现在,二十二年眨眼之间过去了,依然奋斗在编码第一线,挣扎在第一线,借此程序员佳节之际回顾一下这许多年的历程。 由于本人混得实在不好,工作过的地方都用某单位某公司来代替实际的,到…...

复习mysql中的事务
一个事务的开始和结尾必须是 start transaction | commit; rollback 事务特性 1.原子性:多个操作打包成一个整体,要么全部执行,要么一个都不执行。 不过这里的“一个都不执行”并不是真正的全不执行,只是看起来与没执行一样。…...

力扣刷题 day52:10-22
1.数组拆分 给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从 1 到 n 的 min(ai, bi) 总和最大。 返回该 最大总和 。 方法一:排序 #方法一:排序 def arrayPai…...

ELK概述部署和Filebeat 分布式日志管理平台部署
ELK概述部署、Filebeat 分布式日志管理平台部署 一、ELK 简介二、ELK部署2.1、部署准备2.2、优化elasticsearch用户拥有的内存权限2.3、启动elasticsearch是否成功开启2.4、浏览器查看节点信息2.5、安装 Elasticsearch-head 插件2.6、ELK Logstash 部署(在 Apache 节…...

分享一下我家网络机柜,家庭网络设备推荐
家里网络机柜搞了几天终于搞好了,非专业的,走线有点乱,勿喷。 从上到下的设备分别是: 无线路由器(当ap用):TL-XDR6088 插排:德木pdu机柜插排 硬盘录像机:TL-NVR6108-L8P 第二排左边…...
uboot移植之mx6ull_alientek_nand.h文件详解三
一. 简介 mx6ull_alientek_nand.h文件是 开发板的 uboot的一个配置文件。每个开发板都有一个 .h的配置文件。 mx6ull_alientek_nand.h 文件其实是 之前针对正点原子ALPHA开发板移植的 Uboot配置文件。 本文继上一篇文章的学习,地址如下:uboot移植之m…...

[Docker]一.Docker 简介与安装
一、Docker简介与为什么要用 Docker 1.1、Docker 介绍 Docker 是一个跨平台的开源的 应用容器引擎 ,诞生于 2013 年初,基于 Go语言 并遵从 Apache2.0 协议开源, Docker 可以把它理解成虚拟机,但是 Docker 和传统虚拟化方式 有所不同 …...

计算机网络-计算机网络体系结构-传输层
目录 一、UDP 二、TCP 特点 首部格式 连接管理 可靠传输 流量控制(点对点) 拥塞控制(全局) 三、拥塞控制算法 慢开始&拥塞避免 快重传&快恢复 功能一:提供进程与进程之间的逻辑通信 功能二:复用和分用 功能三:对收到的报…...

buuctf[HCTF 2018]WarmUp 1
题目环境: 发现除了表情包,再无其他F12试试发现source.php文件访问这个文件,格式如下:url/source.php回显如下:PHP代码审计: <?php highlight_file(__FILE__); class emmm {public static function ch…...

开源博客项目Blog .NET Core源码学习(4:生成验证码)
开源博客项目Blog中的后台管理登录界面中支持输入验证码(如下图所示),本文学习并记录项目中验证码的生成及调用方式。 博客项目中调用VerifyCode类生成验证码,该类位于App.Framwork项目中,命名空间为App.Framwork…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...

9-Oracle 23 ai Vector Search 特性 知识准备
很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...

篇章二 论坛系统——系统设计
目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...

ArcGIS Pro+ArcGIS给你的地图加上北回归线!
今天来看ArcGIS Pro和ArcGIS中如何给制作的中国地图或者其他大范围地图加上北回归线。 我们将在ArcGIS Pro和ArcGIS中一同介绍。 1 ArcGIS Pro中设置北回归线 1、在ArcGIS Pro中初步设置好经纬格网等,设置经线、纬线都以10间隔显示。 2、需要插入背会归线…...

路由基础-路由表
本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中,往往存在多个不同的IP网段,数据在不同的IP网段之间交互是需要借助三层设备的,这些设备具备路由能力,能够实现数据的跨网段转发。 路由是数据通信网络中最基…...
深度解析:etcd 在 Milvus 向量数据库中的关键作用
目录 🚀 深度解析:etcd 在 Milvus 向量数据库中的关键作用 💡 什么是 etcd? 🧠 Milvus 架构简介 📦 etcd 在 Milvus 中的核心作用 🔧 实际工作流程示意 ⚠️ 如果 etcd 出现问题会怎样&am…...