【MySQL】架构体系概览

本文使用的MySQL版本是8.0

MySQL架构

​MySQL架构整体由外部程序和MySQL服务器构成。其中内部服务器分成连接层,服务层,服务管理和公共组件,存储引擎层和文件系统层。


连接层

连接层的作用是处理客户端的连接。

网络端口

一台MySQL服务器可以监听多个网络端口上的客户端连接。MySQL默认开启的是3306这个端口,可以在配置文件中修改添加多个端口。

连接管理线程

通过连接管理器线程处理端口上的客户端连接请求有以下几个场景:

  • 对于所有平台:一个管理器线程就能处理所有的TCP/IP连接请求。
  • 对于所有平台:可以额外开启一个端口用来管理TCP/IP连接请求。
  • 对于Unix:一个管理器线程还可以处理其他的Unix Socket连接请求。
  • 对于Windows:一个管理器线程处理Shared-memory方式的连接请求,另一个管理器线程处理Named-pipe方式的连接请求。

当连接管理线程收到请求后,它就会把连接请求转发到执行线程。

执行线程

一个执行线程处理一个连接请求。这里使用了池化技术来减少线程的创建与销毁。

当一个请求要处理时,先从线程池中查找是否有可用的线程:如果没有就创建一个来处理连接,当处理结束后,如果线程池没有满,就放入池中后面在用。通过下面几个系统变量和状态变量能控制连接管理线程。

  • 系统变量 thread_cache_size 决定了线程池的大小。默认情况,服务器每次启动时会自动调整这个值,也可以通过选项文件来具体指定,值为0就是禁用缓存池,这样有一个连接就创建执行线程,断开连接后就释放线程。
  • 系统变量 thread_stack=N 来调整线程堆栈的大小,为了应对复杂SQL的深层递归。
  • 状态变量 Threads_cached 来查看线程数,Threads_created 超过线程数后创建的线程数

连接量管理

  • 系统变量 max_connections 可以控制服务器允许同时连接的最大客户端数量(默认是150个)。当达到这个值后,如果还有其他连接,会拒绝其他的请求,并用 状态变量 Connection_errors_max_connections来增量保存连接值。
  • 允许管理员额外连接。这就是为什么是151的原因,当非管理员的连接达到最大之后,管理员还能进行连接。
  • 主从连接的环境中,从节点的连接数也会计入连接数种。

服务层

服务管理和公共组件

1. Backup & Recovery:备份与恢复
备份与恢复是保障 MySQL 数据安全和完整性的关键部分。备份方法有(如物理备份和逻辑备份)、备份工具(如 mysqldump、mysqlhotcopy 和 Percona XtraBackup),以及如何制定和实施有效的备份策略。还包括如何执行数据恢复操作,以便在数据丢失或损坏时快速恢复数据库。

2. Security:安全
安全性在 MySQL 管理中至关重要。设置和管理用户权限、身份验证方式、密码策略、加密通信、数据加密等方面的内容。此外,还包括如何审计和监控数据库活动以防止未经授权的访问和潜在的安全威胁。

3. Replication:主从复制
主从复制允许数据在多个 MySQL 服务器之间同步,这对于负载均衡、高可用性和数据冗余非常重要。

4. Cluster:MySQL集群
MySQL 集群提供了一个高可用性、高可靠性的分布式数据库解决方案。

5. Partitioning:表分区
表分区通过将大表分成更小、更易于管理的子表,提高了查询性能和数据管理效率。

6. Instance Manager:实例管理
实例管理涉及到对 MySQL 实例的配置、启动、停止、监控和调优。

7. Administrator:MySQL管理员
MySQL 管理员需要掌握多方面的知识和技能,包括用户管理、权限控制、安全设置、备份与恢复、性能调优和故障排除等。

8. Migration Toolkit:迁移工具包
迁移工具包(如 MySQL Workbench 中的迁移工具)帮助用户将其他数据库系统的数据迁移到 MySQL。


SQL接口

负责收集客户端发过来的各种sql,并将sql发送到解析器,然后把收集到的结果返回到客户端。

解析器

把收到的sql通过词法分析和语法分析进行判断,如果有错误就返回报错。没有错误就发送给优化器。

查询优化器

通过语法校验的sql就进入查询优化器,这里系统会把我们写的sql转换成最优的执行方案,并把最终的sql交给执行器调用存储引擎api。

缓存

需要注意的是5.6之后的版本这个功能默认关闭,8.0后就被官方删除。

这里的缓存存的是key-value值,key:sql语句,value:结果集。

存储引擎

存储引擎是处理不同表类型 SQL 操作的 MySQL 组件。MySQL 服务器采用可插拔的存储引擎架构,在服务器运行时可以动态加载和卸载。

查看引擎

在MySQL客户端下输入

show engines;
# 或者
select * from information_schema.engines;

InnoDB

InnoDB是一款兼顾高可靠性和高性能的通用存储引擎。在MySQL 5.6及其之后,默认的存储引擎是InnoDB。使用CREATE TABLE语句创建表时,在没有修改默认存储引擎或明确指定其他存储引擎时,将创建一个InnoDB的表。

官方文档:MySQL :: MySQL 8.0 Reference Manual :: 17.1 Introduction to InnoDB

特性

根据官网翻译了一下。

优势

安全方面

  • 如果发生意外而崩溃,无论当时数据库发生了什么,都不需要在重启数据库后执行任何特殊操作。InnoDB的崩溃恢复功能会自动完成崩溃之前提交的更改,并撤消崩溃前正在进行但未提交的更改,从而允许我们从中断的地方继续执行。
  • 支持数据加密

性能方面

  • 支持行级锁,提高了多用户并发性和性能。
  • InnoDB存储引擎维护了自己的缓冲池,在访问数据时会在内存中缓存表和索引数据,以便直接从内存中处理经常使用的数据,从而大幅提升效率。在专用数据库服务器上,通常会将高达80%的物理内存分配给缓冲池。
  • InnoDB表优化了基于主键的查询。每个InnoDB表都有一个称为聚簇索引的主键索引,能够通过最少的磁盘I/O完成对主键的查找。
  • 当从表中反复查询相同的行时,自适应哈希索引会自动接管这些查询,从而达到类似哈希表的查询效率。

数据方面

  • DML 操作遵循 ACID 模型,事务具有提交、回滚和崩溃恢复功能,可保护用户数据。
  • 为了保持数据完整性,InnoDB支持FOREIGN KEY(外键)约束。这意味着在进行插入、更新和删除数据时,InnoDB能够确保相关表之间的一致性。

MyISAM

使用MyISAM存储引擎的表占用空间较小,但由于使用表级锁定,限制了读写操作的性能。因此,它通常用于中小型的Web应用和数据仓库配置中,特别是那些主要是读取或只读的场景。

特性

优势

最大行数为 ( (2^{32})^2 )。

每个MyISAM表最多可以创建64个索引,每个索引最多可以包含16个列。

支持并发插入。

可以通过 CREATE TABLE 语句指定 DATA DIRECTORY=PATH 和 INDEX DIRECTORY=PATH,将数据文件和索引文件放在不同设备的不同目录中,以提高访问速度。

BLOB 和 TEXT 数据类型的列也可以被索引。

索引列中允许使用 NULL 值。

如果在启动时设置了 myisam_recover_options 系统变量,MyISAM表在打开时会进行自查,用于修复未正确关闭的表。

表中 VARCHAR 和 CHAR 列的长度总和最多可达64KB。

UNIQUE 约束的长度没有限制。

存储格式

MyISAM表支持三种不同的存储格式:FIXED(静态/固定格式)、DYNAMIC(动态格式)、以及压缩格式。
压缩格式只能通过 myisampack 实用程序生成,并且是只读格式。
当表中没有 BLOB 或 TEXT 数据类型的列时,可以在使用 CREATE TABLE 或 ALTER TABLE 语句创建或修改表时,结合 ROW_FORMAT 表选项将表格式设置为 FIXED 或 DYNAMIC。
可以使用 myisamchk 工具对已压缩的MyISAM表进行解压操作,命令为 myisamchk --unpack。

静态格式表

静态格式是 MyISAM 表的默认格式,在表不包含可变长度的列(如 VARCHAR、VARBINARY、BLOB 或 TEXT)时使用。每行数据都使用固定数量的字节存储,这使得静态格式在某些方面具有显著的优势:

简单和安全性高:静态格式是最简单和最安全的存储格式之一,最不容易损坏。
读取效率高:由于每行长度固定,根据索引中的行号乘以行长度可以快速计算出行的位置,这使得读取操作非常高效。
存储和重建:崩溃后易于重建,因为每行数据都位于固定位置,不易出现数据碎片化问题。
空间利用:虽然静态格式表需要比动态格式表更多的磁盘空间,但由于数据存储方式的简单性和高效性,通常能够提供更快的性能。
静态格式表还有以下特点:

对于 CHAR 和 VARCHAR 类型的列,使用空格填充到指定的列宽度;对于 BINARY 和 VARBINARY 类型的列,使用 0x00 字节填充到列宽度。
每个允许为 NULL 的列会使用额外的 1 BIT 空间记录当前列是否为空。
由于数据在磁盘上的布局更为简单直接,静态格式表也更容易被操作系统的磁盘缓存所利用,从而提升整体的读取速度。

动态格式表

动态存储格式在 MySQL 中是一种高度灵活的表格存储方式,特别适用于包含可变长度列(如 VARCHAR、VARBINARY、BLOB 或 TEXT)的情况,或者在创建表时明确指定使用 ROW_FORMAT=DYNAMIC 选项。以下是动态格式表的关键特点:

  • 动态长度:对于字符串类型的列,长度是动态的,并且每行都有一个标志来指示行的实际长度。当行因更新操作而变长时,数据可能会存储在不连续的空间中,这可能导致数据碎片化。为了优化表的性能和空间利用,可以使用 OPTIMIZE TABLE table_name 或 myisamchk -r 来进行碎片整理。
  • NULL 列标志:每个允许为 NULL 的列都会使用一个额外的 1 BIT 空间来记录该列是否为空。
  • 位图存储:每行前面有一个位图,用于记录哪些列包含空字符串或零值。如果字符串类型的列长度为零或数字列的值为零,会在位图中标记,而实际上不会保存到磁盘中,从而节省存储空间。
  • 磁盘空间利用率高:相比于固定长度表格,动态格式表通常能够更有效地利用磁盘空间,因为它可以按需存储每行的实际数据长度。
  • 单独压缩:每行数据和每列数据都可以使用单独的压缩方式,这使得动态格式表在存储和读取大量文本或二进制数据时更加灵活和高效。

在使用动态格式表时,还可以通过优化数据类型选择和压缩方式来进一步提高性能和节省存储空间。比如对于整数列,如果值的范围很小,可以选择更小的数据类型,如将 bigint 类型的列转换为 tinyint 类型,以减少存储空间的使用。

压缩格式表

压缩存储格式在 MySQL 中指的是通过 myisampack 工具生成的只读格式数据表。以下是压缩表的主要特点:

  • 磁盘空间效率:压缩表非常有效地利用磁盘空间,最大限度地减少了存储数据所需的空间。这是通过将数据进行压缩来实现的,通常能够显著减少存储需求。
  • 适用性:压缩表可以用于处理固定长度或动态长度的行数据,这使得它在不同类型的数据存储需求下都能发挥作用。
  • 只读特性:压缩表是只读的,这意味着一旦数据被压缩并生成压缩表,就不能向表中添加新数据或者更新已有的数据。这种只读性质是为了保证数据在压缩后的完整性和一致性。
  • 使用与解压:生成压缩表后,可以使用 myisamchk 工具对其进行解压缩,这样可以恢复表的可写状态,从而允许对表进行更新和修改操作。解压缩后的表将回到原始的 MyISAM 表格格式。

压缩存储格式表格通常适用于需要节省大量磁盘空间并且对数据进行只读访问的情况,例如归档数据或静态数据集。


InnoDB和MyISAM的区别

不同点InnoDBMyISAM
事务支持不支持
外键支持不支持
自适应hash索引支持不支持
锁粒度最小到行只能到表
单表最大限制64TB256TB

其他存储类型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/862164.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++精解【8】

文章目录 运算,- 加减法* / 乘除法逐元 乘法逐元 除法逐元综合运算矩阵乘法与加减法 转置、共轭、伴随矩阵点乘法,叉积 运算 ,- 加减法 逐元加减法 #include <iostream> #include "e:/eigen/Eigen/Dense" using namespace std;int main() {Eigen::Matrix2d …

clip系列改进Lseg、 group ViT、ViLD、Glip

Lseg 在clip后面加一个分割head&#xff0c;然后用分割数据集有监督训练。textencoder使用clip&#xff0c;frozen住。 group ViT 与Lseg不同&#xff0c;借鉴了clip做了真正的无监督学习。 具体的通过group block来做的。使用学习的N个group token&#xff08;可以理解为聚类…

计算机毕业设计hadoop+spark+hive知识图谱医生推荐系统 医生数据分析可视化大屏 医生爬虫 医疗可视化 医生大数据 机器学习 大数据毕业设计

测试过程及结果 本次对于医生推荐系统测试通过手动测试的方式共进行了两轮测试。 &#xff08;1&#xff09;第一轮测试中执行了个20个测试用例&#xff0c;通过16个&#xff0c;失败4个&#xff0c;其中属于严重缺陷的1个&#xff0c;属于一般缺陷的3个。 &#xff08;2&am…

Ueditor中集成135编辑器

一、背景 在资讯项目平台运营过程中&#xff0c;资讯需要排版&#xff0c;一般都是在135编辑器排好以后&#xff0c;复制到平台中UEditor编辑器中&#xff0c;所以&#xff0c;他们建议集成一下135哈 二、了解135编辑器 开始调研了解135编辑器&#xff0c;发现人家就支持集成…

Golang | Leetcode Golang题解之第202题快乐数

题目&#xff1a; 题解&#xff1a; func isHappy(n int) bool {cycle : map[int]bool{4: true, 6: true, 37: true, 58: true, 89: true, 145: true, 42: true, 20: true}for n ! 1 && !cycle[n] {n step(n)}return n 1 }func step(n int) int {sum : 0for n > …

AI数据分析007:根据Excel表格数据绘制柱形图

文章目录 一、介绍二、输入内容三、输出内容一、介绍 将Excel文件中2013年至2019年间线上图书的销售额,以条形图的形式呈现,每个条形的高度代表相应年份的销售额,同时在每个条形上方标注具体的销售额数值 二、输入内容 在deepseek中输入提示词: 你是一个Python编程专家,…

SMTP 转发器/中继

设置中继邮件服务器 我将设置一个邮件服务器&#xff0c;该服务器稍后将用作 SMTP 中继服务器。首先&#xff0c;在 Digital Ocean 中创建了一个新的 Ubuntu Droplet&#xff1a; Postfix MTA 安装在droplet上&#xff0c;并带有&#xff1a; apt-get install postfix 在pos…

【Python实战因果推断】4_因果效应异质性4

目录 Cumulative Gain Target Transformation Cumulative Gain 如果采用与累积效应曲线完全相同的逻辑&#xff0c;但将每个点乘以累积样本 Ncum/N&#xff0c;就会得到累积增益曲线。现在&#xff0c;即使曲线的起点具有最高的效果&#xff08;对于一个好的模型来说&#x…

Web渗透:文件包含漏洞(part.1)

"文件包含漏洞"&#xff08;File Inclusion Vulnerability&#xff09;是一种常见的Web应用程序漏洞&#xff0c;攻击者可以通过这个漏洞在目标系统上包含或执行任意文件。主要有两种类型的文件包含漏洞&#xff1a; 本地文件包含&#xff08;Local File Inclusion, …

C++ | Leetcode C++题解之第201题数字范围按位与

题目&#xff1a; 题解&#xff1a; class Solution { public:int rangeBitwiseAnd(int m, int n) {while (m < n) {// 抹去最右边的 1n n & (n - 1);}return n;} };

Linux CentOS 宝塔中禁用php8.2的eval函数详细图文教程

PHP_diseval_extension 这个方法是支持PHP8的, Suhosin禁用eval函数&#xff0c;不支持PHP8 一、安装 cd / git clone https://github.com/mk-j/PHP_diseval_extension.gitcd /PHP_diseval_extension/source/www/server/php/82/bin/phpize ./configure --with-php-config/ww…

Go语言学习:每日一练2

Go语言学习&#xff1a;每日一练2 目录 Go语言学习&#xff1a;每日一练2结构体零值数组切片映射指针 各个类型的零值一览 结构体 //定义 type Vertex struct {X, Y int } //使用 func main() { v1 : Vertex{1, 2} fmt.Println(v.X) //别的实例化方式 var v2 Vertex v2 : *new…

Node版本管理工具 fnm 安装使用

fnm 是一个基于 Rust 开发的 Node 版本管理工具&#xff0c;它的目标是提供一个快速、简单且可靠的方式来管理 Node.js 的不同版本。同时&#xff0c;它是跨平台的&#xff0c;支持 macOS、Linux、Windows。&#x1f680; Fast and simple Node.js version manager, built in R…

头歌资源库(18)接龙序列

一、 问题描述 二、算法思想 首先&#xff0c;我们需要判断一个数列是否是接龙数列。可以通过遍历数列的每一个元素&#xff0c;判断该元素的首位数字是否等于前一个元素的末位数字。如果所有元素都满足条件&#xff0c;则该数列是接龙数列。 接下来&#xff0c;我们需要计算…

行人检测技术:思通数科大模型在自动驾驶安全中的应用

在自动驾驶技术飞速发展的今天&#xff0c;行人检测已成为确保道路交通安全的关键技术之一。本文将探讨如何结合思通数科大模型和计算机视觉技术&#xff0c;实现在城市交通环境中对行人的高效检测&#xff0c;为自动驾驶车辆提供必要的行人安全保障。 引言 行人检测技术是利…

vue3用自定义指令实现按钮权限

1&#xff0c;编写permission.ts文件 在src/utils/permission.ts import type { Directive } from "vue"; export const permission:Directive{// 在绑定元素的父组件被挂载后调用mounted(el,binding){// el&#xff1a;指令所绑定的元素&#xff0c;可以用来直接操…

大模型推理知识总结

一、大模型推理概念 大多数流行的only-decode LLM&#xff08;例如 GPT-3&#xff09;都是针对因果建模目标进行预训练的&#xff0c;本质上是作为下一个词预测器。这些 LLM 将一系列tokens作为输入&#xff0c;并自回归生成后续tokens&#xff0c;直到满足停止条件&#xff0…

【PL理论深化】(8) Ocaml 语言:元组和列表 | 访问元组中的元素 | 列表中的 head 和 tail | 基本列表操作符

&#x1f4ac; 写在前面&#xff1a;本章我们将探讨 OCaml 中的元组&#xff08;tuple&#xff09;和列表&#xff08;list&#xff09;&#xff0c;它们是函数式编程语言中最常用的数据结构。 目录 0x00 元组&#xff08;Tuple&#xff09; 0x01 访问元组中的元素 0x02 列表&…

沉淀强化镍基合金660大螺丝的物理性能

沉淀强化镍基合金660大螺丝&#xff0c;是一种高性能的工程材料&#xff0c;其在极端环境中展现了优异的稳定性和耐用性。以下&#xff0c;我们将深入解析其主要的物理性能。 首先&#xff0c;该合金螺丝的密度为7.99g/cm&#xff0c;这意味着它具有较高的质量密度&#xff0c;…

APM Profile 在系统可观测体系中的应用

引言 应用程序性能分析&#xff08;Application Performance Management&#xff0c;APM&#xff09;是一个广泛的概念&#xff0c;涉及应用程序运行时各种性能指标的监测、诊断和优化。在可观测体系建设中&#xff0c;APM 是保障系统业务运行性能的关键技术&#xff0c;确保用…