MySQL的体系架构

2023-11-18

在这里插入图片描述

前言

在学习一种事务之前,我们需要先了解事物的基本组成结构,清楚了事物的基本组成结构之后,我们才能更深入的了解相关操作,那么今天我将为大家介绍MySQL的体系架构。

在这里插入图片描述
MySQL数据库的服务端主要分为Server层和存储引擎层,接下来我将以这两层为着重点为大家介绍MySQL的体系架构。

MySQL的Server层

MySQL的Server层照顾要有七个组件:

  1. MySQL 向外提供的交互接口(Connectors)
  2. 连接池组件(Connection Pool)
  3. 管理服务组件和工具组件(Management Service & Utilities)
  4. SQL 接口组件(SQL Interface)
  5. 查询分析器组件(Parser)
  6. 优化器组件(Optimizer)
  7. 查询缓存组件(Query Caches & Buffers)

1)MySQL向外提供的交互接口(Connectors)
Connectors 组件是 MySQL 向外提供的交互组件,如Java,.NET,PHP等语言可以通过该组件来操作 MySQL 语句,实现与 MySQL 的交互。建立连接之后,可以通过show processlist 语句来查看已经建立的连接。
在这里插入图片描述
如果客户端一段时间内没有活跃行为,那么连接器在默认的8个小时后会主动断开连接。加果在连接被断开之后,客户端再次发送请求的话,就会收到一个错误提醒:Lost connection to MySQL server during query。

客户端连接到MySQL数据库上时,根据连接时间的长短可以分为:短连接和长连接。短连接比较简单,指每次查询之后会断开,再次查询需要重新建立连接,因此使用短连接的成本较高;长连接指长时间连接到MySOL数据库上并执行数据库操作,因此长连接会导致出现内存溢出的问题从而使MySQL异常重启。

在使用长连接时,可以使用客户端函数mysql_reset_connection()来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。

2)连接池组件(Connection Pool)

负责监听客户端向MySQL服务器端的各种请求,接收请求、转发请求到目标模块。每个成功连接MySQL服务器端的客户请求都会被创建或分配一个线程,该线程负责客户端与MySQL服务器端的通信,接收客户端发送的命令,传递服务器端的结果信息等。

3)管理服务组件和工具组件(Management Service &Utilities)

提供对MySOL的集成管理,如备份(Backup)、恢复(Recovery)、安全管理(Security)等。

4)SQL接口组件(SQL Interface)

接收用户SQL命令,如DML、DDL和存储过程等,并将最终结果返回给用户。

5)查询分析器组件(Parser)

系统在执行输入语句之前,必须分析出语句想要干什么。例如:首先通过select关键字得知这是一条查询命令,还包括分析要查询的是哪张表以及查询条件是什么。同时,分析器必须分析输入语句的语法正确性。如果SQL中存在语法的错误,则查询分析器组件将返回提示信息“You have an error in your SQL syntax”。

6)优化器组件(Optimizer)

优化器是MySQL用来对输人语句在执行之前所做的最后一步优化。优化内容包括:是否选择索引、选择哪个索引、多表查询的联合顺序等。每一种执行方法的逻辑结果是一样的,但是执行的效率会有不同,而优化器的作用就是决定选择使用哪一种方案。

7)查询缓存组件(Query Caches & Buffers)
这个查询缓存是比较容易理解的。在每一次查询时,MySQL 都先去看看是否命中缓存,命中则直接返回,提高了系统的响应速度。但是这个功能有一个相当大的弊病,那就是一旦这个表中数据发生更改,那么这张表对应的所有缓存都会失效。

对于更新压力大的数据库来说,查询缓存的命中率会非常低。除非业务系统就只有一张静态表,很长时间才会更新一次。比如,一个系统配置表,那这张表上的查询才适合使用查询缓存。所以在生产系统中,建议关闭该功能。

在MySQL8.0版本之前,可以通过将参数“query_cachetype”设置成OFF,来关闭查询缓存的功能。但是在MySQL8.0版本之后,直接删掉了这部分的功能。

show variables like '% query_cache% ';

MySQL的存储引擎

MySQL 存储引擎层负责数据的存储和提取,其架构模式是插件式的,支持InnoDB、MyISAM、Memory、Archive、NDB Cluster等多个存储引擎。最常用的是InnoDB,我将为大家详细介绍InnoDb、MyISAM 和 Mymery 存储引擎。

我们可以使用 show create table 表名; 来查看创建表时使用的存储引擎。

 create table test (id int);
 show create table test;

在这里插入图片描述

1)InnoDB 存储引擎

InnoDB是MySQL的默认存储引擎,它支持ACID(原子性、一致性、隔离性和持久性)事务,并提供了行级锁定、外键约束和崩溃恢复等功能。它适用于大多数应用场景,特别是需要事务支持和高并发读写操作的应用。

它具有以下特性:

  1. 事务支持:InnoDB引擎支持事务的ACID属性,确保了数据的原子性、一致性、隔离性和持久性。这意味着可以使用BEGIN、COMMIT和ROLLBACK语句来管理事务,保证数据的完整性和一致性。
  2. 行级锁定:InnoDB使用行级锁来处理并发访问和修改数据,而不是表级锁。这意味着多个事务可以同时访问同一表的不同行,提高了并发性能和并发控制。
  3. 外键约束:InnoDB支持外键约束,可以在数据库层面实现数据的一致性和完整性。它提供了CASCADE、RESTRICT和SET NULL等选项来处理外键关系。
  4. 崩溃恢复:InnoDB具有崩溃恢复的能力,即使在系统崩溃或电源故障的情况下,也可以保证数据的完整性。它通过事务日志(redo log)来恢复未完成的事务和恢复已提交的事务。
  5. 自动增长列:InnoDB支持自动增长列,可以为表中的某一列指定自动递增的整数值,简化了数据插入操作。
  6. 回滚段:InnoDB通过回滚段(Rollback Segment)来存储未提交事务的数据,以便在需要时进行回滚操作。
  7. 可以在线热备份:InnoDB引擎支持在线热备份,可以在不停止MySQL服务器的情况下备份数据库。
  8. 支持MVCC(多版本并发控制):InnoDB使用多版本并发控制来处理并发事务,在读操作的同时允许写操作,并通过行版本来实现数据的隔离性和一致性。
  9. 高性能:InnoDB引擎通过使用缓冲池(Buffer Pool)来缓存热门数据和索引,提高读取数据的性能。

2)MyISAM 存储引擎

MyISAM是MySQL的另一个常见的存储引擎,它不支持事务和行级锁定,但具有良好的性能。MyISAM适用于主要是读取操作的应用,如数据仓库、归档和非事务性的应用。

它具有以下特性:

  1. 快速读取速度:MyISAM存储引擎在读取数据时非常高效,对于主要是读取操作的应用性能表现较好。这是因为MyISAM表以表级锁定的方式处理并发,读操作可以并发执行,不会有行级锁定带来的争用。
  2. 支持全文索引:MyISAM存储引擎对全文索引提供了良好的支持,可以通过创建全文索引提供高效的文本搜索能力。
  3. 节省磁盘空间:相较于InnoDB存储引擎,MyISAM通常在磁盘占用方面更加节省空间,这是因为它不支持事务、行级锁定和崩溃恢复等功能,减少了存储额外的元数据和日志。
  4. 表级锁定:MyISAM存储引擎使用表级锁定,这意味着一个写操作锁定整个表,因此在写操作频繁的情况下可能会导致并发性能下降。
  5. 不支持事务和外键:MyISAM存储引擎不支持事务操作,也不支持外键约束。这意味着在使用MyISAM时,你无法使用BEGIN、COMMIT和ROLLBACK等事务操作,也无法定义外键约束来维护数据的完整性。
  6. 不支持崩溃恢复:MyISAM存储引擎没有崩溃恢复的能力,这意味着如果MySQL服务器在写操作过程中崩溃,可能会导致数据的不一致。
  7. 自动维护索引统计信息:MyISAM存储引擎会自动维护表的索引统计信息,这些统计信息用于优化查询执行计划。
  8. 多用途:MyISAM存储引擎适用于主要是读取操作的应用场景,如报表、日志分析和静态网站等。

我们可以在创建表的时候指定存储引擎。

create table 表名 (     ) engine = 存储引擎名
 create table test1 (id int) engine = myisam;
 show create table test1;

在这里插入图片描述
正是因为 MyISAM 存储引擎的这些特性,它适合于以下场景:

  1. 不需要事务支持的场景
  2. 读多或者写多的单一业务场景,读写频繁的则不合适
  3. 读写并发访问较低的业务
  4. 数据修改相对较少的业务
  5. 以读为主的业务
  6. 对数据的一致性要求不是很高的业务
  7. 服务器硬件资源相对比较差的环境

3)Memory 存储引擎

Memeory 存储引擎将表中的数据存储在内存中,而不是磁盘上,也就是说如果重启MySQL 或者关闭,此时的数据将会丢失。

create table test2 (id int,name varchar(20)) engine = memory;
show create table test2;
insert into test2 values (1,'zhangsan');
select * from test2;

在这里插入图片描述

# 重启MySQL
systemctl restart mysqld
select * from test2;

输出信息

Empty set (0.00 sec)

Memory 存储引擎具有以下特点:

  1. 高速读写:由于数据存储在内存中,Memory 存储引擎提供非常快速的读取和写入性能。相比于其他存储引擎,它可以更快地执行查询和写入操作。
  2. 临时数据和缓存表:由于数据存储在内存中,Memory 存储引擎对于处理临时数据和缓存表非常有效。如果你需要在查询过程中创建一些临时数据,并且它们在查询结束后不再需要,那么 Memory 引擎是一个不错的选择。
  3. 高速缓存索引:Memory 存储引擎对索引查询非常快速,因为索引数据完全存储在内存中,减少了磁盘I/O的开销。
  4. 不持久化:Memory 引擎的数据不会持久化到磁盘上,一旦 MySQL 服务器重启或关闭,存储在 Memory 引擎中的数据就会丢失。因此,Memory 存储引擎适合于处理非持久化的数据,并且可以在服务器重新启动后重新加载数据。
  5. 适用于小规模数据:由于数据存储在内存中,Memory 存储引擎的容量受限于可用的内存大小。它不适合用于处理大规模数据集,因为内存可能会成为限制因素。
  6. 不支持事务和崩溃恢复:Memory 存储引擎不支持事务,也不支持崩溃恢复。因此,在使用 Memory 存储引擎时需要注意数据的一致性和持久性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL的体系架构 的相关文章

  • 为什么 adb install 失败? [复制]

    这个问题在这里已经有答案了 我知道adb install如果现有包具有不同的版本 则不会替换它type 即调试与发布 每当我运行调试会话时 Eclipse 也会成功替换调试 apk 但是当我尝试adb install用于替换现有的relea
  • MySQL:为什么 IN 子句中的第 5 个 ID 会极大地改变查询计划?

    给出以下两个查询 Query 1 SELECT log id FROM log WHERE user id IN 188858 188886 189854 203623 204072 and type in 14 15 17 ORDER B
  • mysqldump创建空sql文件? [Windows 上的 php 和 mysql]

    我尝试转储数据库 我尝试了指定 mysqldump exe 的完整路径或仅使用 mysqldump 它仍然给我一个 0kb dumpfile sql 细节 编程语言 PHP 数据库 MySql 5 XX 操作系统 服务器 Windows S
  • 搜索多个表 (SQL)

    我需要能够有一个 SQL 查询来使用简单的搜索来搜索我的数据库 这是我的表格现在的样子 Table artists id name Table albums id artistID name Table songs id albumID n
  • Python MySQL 模块

    我正在开发一个需要与 MySQL 数据库交互的 Web 应用程序 但我似乎找不到任何真正适合 Python 的模块 我特别寻找快速模块 能够处理数十万个连接 和查询 所有这些都在短时间内完成 而不会对速度产生重大影响 我想我的答案将是游戏领
  • Laravel 中的 SQL 运算符是什么?

    我正在查看 Laravel 的源代码 发现了很多 Eloquent 的 SQL 运算符 我想知道其中一些是什么以及如何使用它们 不幸的是我没有找到任何文档 这是我找到的运营商vendor laravel framework src Illu
  • 如何限制mySQL中的搜索和替换字符串

    我用它来搜索和替换 mySQL 中的字符串 UPDATE products SET prodname REPLACE prodname S S 这些产品包含诸如 TYLENOL TABS 100 S 之类的字符串 我想将其转换为 TYLEN
  • 如何在此查询中获取以 KM 为单位的距离

    salons Salon select salons gt selectRaw 6371 acos cos radians cos radians lat cos radians lng radians sin radians sin ra
  • MySQL 错误“连接过多”

    我正在将 MySQL 5 0 用于由 GoDaddy linux 托管的网站 我正在对我的网络应用程序进行一些测试 突然我注意到页面刷新速度非常慢 最后 经过漫长的等待 我到达了一个页面 上面写着 MySQL 错误 连接太多 它指向我连接到
  • MySQL中如何重置表的自增列

    我有一张桌子 它的第一列sl是自动递增的 填充表格后 我删除了前两行 第一个条目有sl1 是否可以重置为1维持AI 我正在使用 PHP MyAdmin ALTER TABLE tablename AUTO INCREMENT 1
  • MySQL如何在没有过程/函数的情况下执行命令块

    我尝试在 MySQL Workbench 上运行一段 SQL 命令 就像在 SQL Server 上一样 但它告诉我 声明在此位置无效 我在网上看到了各种这样的例子 我真的不明白为什么会出现这个错误 一些提示 代码 其中 SQL Serve
  • 保护存储过程

    我想知道是否有一种方法可以对某些用户隐藏存储过程的文本 我正在使用 MySQL 5 1 48 和 Net Connector 6 2 3 以及 Visual Studio 2008 SP1 我在 MySQL 中有两个用户 一个是 root
  • 表被指定两次作为 INSERT 的目标和单独的数据源

    我做了这个查询 但它给了我错误 就像标题中一样 INSERT INTO data waktu vaksinasi id binatang id vaksin tanggal vaksin status vaksin VALUES 1 1 S
  • Navicat 中的 MySQL 视图 - 如何定义“主键”?

    当我在 Navicat 中定义视图时 经常会收到以下消息 xxx 没有主键 对此表的更新将使用以下伪语句完成 UPDATE xxx SET ModifiedFieldsAndValues WHERE AllFieldsAndOldValue
  • 在“GROUP BY”子句中重用选择表达式的结果?

    在 MySQL 中 我可以有这样的查询 select cast from unixtime t time Y m d H 00 as datetime as timeHour from some table t group by timeH
  • 如何在mysql中设置“performance_schema on”?

    我想转performance schemaON 在 mysql 中收集统计信息 我怎样才能实现这个目标 以下指南是特定于 Linux 的 但应该很容易适用于 Windows 您必须检查 mysql 服务器二进制文件是否已编译为支持它 mys
  • 获取直方图数据

    有没有办法在 MySQL 中指定 bin 大小 现在 我正在尝试以下 SQL 查询 select total count total from faults GROUP BY total 生成的数据足够好 但行太多 我需要的是一种将数据分组
  • 如何在不违反唯一约束的情况下交换MySQL中两行的值?

    我有一个带有优先级列的 任务 表 它具有唯一的约束 我试图交换两行的优先级值 但我一直违反约束 我在类似的情况下在某个地方看到过这个语句 但不是 MySQL 的 UPDATE tasks SET priority CASE WHEN pri
  • 如何从java中的字符串时间戳中提取日期和时间

    我正在获取日期和时间String TIMESTAMP来自服务器的 MySQL 格式如下 2014 02 15 05 18 08 我想要的是提取日期DD MM YYYY格式和时间HH MM SS AM PM格式 而且这个时间戳的时区是不同的
  • 使用 MySQL 触发器将所有表更改记录到辅助表

    我有一张桌子 CREATE TABLE data table data id INT NOT NULL AUTO INCREMENT PRIMARY KEY field1 INT NOT NULL field2 INT NOT NULL f

随机推荐

  • mysql之控制流程26

    1 控制流程 mysql的控制流程和C Java一样 都不难 看几个例子然后敲几遍就熟了 流程控制结构 顺序 分支 循环 一 分支结构 1 if函数 语法 if 条件 值1 值2 功能 实现双分支 应用在begin end中或外面即可以认为
  • 一起来学nginx(一)

    一起来学nginx 一 nginx概述 nginx是一款web服务器 相当于一个软件 除了nginx还有哪些web服务器 apche openresty nginx的优点 高并发 高性能 可扩展性好 nginx是模块化的 可靠性 热部署 在
  • org.springframework.core.NestedIOException: Failed to parse mapping resource: 'file [XXX.xml]';

    tomcat启动时报错 Caused by org springframework core NestedIOException Failed to parse mapping resource file XXX xml nested ex
  • GDI+学习笔记四-双缓冲图形类

    双缓冲图形 问题 当在窗体中绘制较为复杂的图形对象时 常会出现闪烁的问题 NET Framework解决方案 提供了双缓冲功能 原理是 当启用双缓冲时 所有绘制操作首先呈现到内存缓冲区 而不是屏幕上的绘图图面 所有绘制操作完成后 内存缓冲区
  • 为了响应工信部要求,我们整理了这些网络账户注销指南

    福利 网络安全重磅福利 入门 进阶全套282G学习资源包免费分享 今年 1 月份 工信部在 回应网民问手机 App 销户的问题 时 明确表示用户有权删除在平台服务商注册的账户服务 根据 中华人民共和国网络安全法 第四十三条规定 个人发现网络
  • 智能学习

    智能学习 MATLAB实现ACO BP多变量时间序列预测 蚁群算法优化BP神经网络 目录 智能学习 MATLAB实现ACO BP多变量时间序列预测 蚁群算法优化BP神经网络 预测效果 基本介绍 程序设计 参考资料 预测效果 基本介绍 MAT
  • 解决内存溢出OutOfMemoryError异常

    今天启动项目时 突然了报了OOM异常 如图所示 解决办法很简单 就是把内存设置大点 主要问题是在哪里设置 1 jvm内存设置 jvm虚拟机的内存设置是在jdk jre lib amd64目录下的jvm cfg文件中设置 在最下面加上相关配置
  • Spring Boot —— Log的八个日志级别

    文章目录 Spring Boot Log的八个日志级别 前言 ALL TRACE DEBUG INFO WARN ERROR FATAL OFF Spring Boot Log的八个日志级别 前言 在项目中会出现经常使用日志的情况 而日志又
  • OAuth2 oauth_client_details表字段的详细说明

    OAuth2 oauth client details表字段的详细说明 clientdetails 妖四灵 Shuen的博客 CSDN博客
  • QT中https 访问

    QT 中支持https 在原有的http的代码基础上需要加上如下代码块 QNetworkRequest request QSslConfiguration conf QSslConfiguration defaultConfiguratio
  • WSL 使用的文件没有权限无法删除

    转载于 https www cnblogs com jffun blog p 11255096 html
  • Vite 和 Webpack 的区别

    Vite 和 Webpack 都是前端打包工具 它们的作用类似 但实现方式和使用方法有所不同 以下是它们之间的一些区别 构建速度 Vite 的构建速度比 Webpack 更快 因为 Vite 在开发环境下使用了浏览器原生的 ES 模块加载
  • 浏览器油猴插件Tampermonkey下载安装

    没有插件的浏览器 不是真正的浏览器 当我们的浏览器装上插件之后 瞬间强大了许多 下面给大家介绍一下浏览器插件神器油猴插件Tampermonkey的下载安装 油猴Tampermonkey插件下载安装方法一 直接打开油猴Tampermonkey
  • 为什么要用box-sizing: border-box?一般什么时候用?

    1 新建一个HTML文档 并定义一个块元素 CSS示例 normal width 100px height 100px background blue 步骤阅读 2 保存文件 预览效果 步骤阅读 3 再次加入一个DIV并在原有的CSS上复制
  • 二十三、SQL 数据分析实战(10个简单的SQL题目)

    文章目录 题目1 比赛名单整理 题目2 热门游戏排行 题目3 社区生鲜App覆盖分析 题目4 社区团购行为分析 题目5 统计字符出现次数 题目6 找出各类别商品销量最高的商品 题目7 找出每个部门薪资第二高的员工 题目8 游戏玩家登录情况分
  • Java面向对象编程

    在单处理器系统中 如果同时存在有12个进程 则处于就绪队列中的进程数量最多为 A 1 B 9 C 10 D 11 答案 D 以下关于多线程的叙述中错误的是 A 线程同步的方法包括使用临界区 互斥量 信号量等 B 两个线程同时对简单类型全局变
  • 约瑟夫环问题(报数问题)

    先说一下什么是约瑟夫环问题 这是百科的解释 约瑟夫环 约瑟夫问题 是一个数学的应用问题 已知n个人 以编号1 2 3 n分别表示 围坐在一张圆桌周围 从编号为k的人开始报数 数到m的那个人出列 他的下一个人又从1开始报数 数到m的那个人又出
  • 如何在csdn免费下载资料?

    1 可以在个人设置里 绑定手机账号奖励整整50分 点下头像一个人中心一账号设置一手机绑定 2 完成任务 任务要在http task csdn net 里才能看到 3 上传有效 有效啊 别上个广告啊 非法啥的 反而还扣了 资源 4 评论资源
  • QT 5.8

    QT与Qt Creator 前者是框架 类似与MFC 而后者是QT的编译器 也可以使用Visual studio编辑 编译需要其他的 Index of new archive qt 5 8 5 8 0
  • MySQL的体系架构

    文章目录 前言 MySQL的Server层 MySQL的存储引擎 1 InnoDB 存储引擎 2 MyISAM 存储引擎 3 Memory 存储引擎 前言 在学习一种事务之前 我们需要先了解事物的基本组成结构 清楚了事物的基本组成结构之后