【MySQL】架构体系概览

news2024/11/23 15:48:08

本文使用的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.coloradmin.cn/o/1871448.html

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

相关文章

kettle使用手册 安装9.0版本 建议设置为英语

0.新建转换的常用组件 0. Generate rows 定义一个字符串 name value就是字符串的值 0.1 String operations 字段转大写 去空格 1. Json input 来源于一个json文件 1.json 或mq接收到的data内容是json字符串 2. Json output 定义Jsonbloc值为 data, 左侧Fieldname是数据库…

MySQL 实训作业

1、DDL\DML -- 创建学生表 CREATE TABLE students (student_id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50),age INT,gender VARCHAR(10) );-- 创建课程表 CREATE TABLE courses (course_id INT PRIMARY KEY AUTO_INCREMENT,course_name VARCHAR(50) );-- 创建教师表 CR…

WSL Ubuntu安装可视化界面详细指南

首先,你需要先通过wsl安装好Ubuntu系统,本章教程介绍如何安装可视化桌面。 一、下载软件 下载地址:https://www.alipan.com/s/Swd8vzUwsUR 二、配置软件 三、安装xfce sudo apt-get install xfce4四、环境配置</

【力扣】有效的字母异位词

&#x1f525;博客主页&#xff1a; 我要成为C领域大神&#x1f3a5;系列专栏&#xff1a;【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 给定两个字符串 s …

【Dison夏令营 Day 01】如何用Python写一个游戏“石头剪刀布”

欢迎你们踏入这个充满无限可能性的编程世界&#xff01;作为一名热爱Python的开发者&#xff0c;我深感编程的魅力&#xff0c;并希望与你们一同分享这份乐趣和激情。编程&#xff0c;不仅仅是一种技能&#xff0c;更是一种思维方式和解决问题的工具。在Python的世界里&#xf…

生成器模式详解:用法与示例

目录 生成器模式生成器模式结构生成器模式应用场景生成器模式优缺点练手题目题目描述输入描述输出描述提示信息题解 生成器模式 生成器模式&#xff0c;又称建造者模式&#xff0c;是一种创建型设计模式&#xff0c; 使你能够分步骤创建复杂对象。该模式允许你使用相同的创建代…

UE5的引擎初始化流程

UE5的引擎初始化流程 首先跟着UE的官方文档[1]获取到UE的源代码&#xff0c;然后在参考GitHub上repo的readme&#xff0c;将UE引擎从源码build出来。以Windows平台为例&#xff0c;先找到引擎的入口函数&#xff1a; int32 WINAPI WinMain(_In_ HINSTANCE hInInstance, _In_op…

头歌资源库(17)多机调度问题

一、 问题描述 二、算法思想 首先&#xff0c;将作业按照所需时间从大到小排序。 创建一个长度为m的数组task_time&#xff0c;用来记录每台机器已经加工的作业时间。 从第一个作业开始&#xff0c;依次将作业分配给空闲的机器&#xff0c;并更新task_time数组。 对于每个…

springboot 集成阿里云 OSS

引入依赖 <!-- 阿里云oss依赖 --> <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.9.1</version> </dependency><?xml version"1.0" encoding"…

阿里云centos 7.9 使用宝塔面板部署.netcore 6.0

前言&#xff1a; 我有一个netcore6.0的系统接口和手机端程序的站点程序之前是部署在一台windows测试服务器的IIS站点中&#xff0c; 服务器最近压力太大扛不住了&#xff0c;买了一台centos7.9的阿里云服务器准备进行迁移。具体操作日记如下。 一、安装宝塔面板 这一步涉及…

【人工智能学习之图像操作(二)】

【人工智能学习之图像操作&#xff08;二&#xff09;】 图像上的运算图像混合按位运算 图像的几何变换仿射变换透视变换膨胀操作腐蚀操作开操作闭操作梯度操作礼帽操作黑帽操作 图像上的运算 图像上的算术运算&#xff0c;加法&#xff0c;减法&#xff0c;图像混合等。 加减…

AI进阶指南第五课,大模型相关概念(知识库,微调)

虽然前面大概讲了一下大模型的一些基本概念&#xff0c;但是那些都比较偏向于大模型本身&#xff0c;但是我们使用的时候如果只靠大模型肯定是不行的。 就好比如果一个人只有一个脑子&#xff0c;其他什么部位也没有的话&#xff0c;那场面。&#xff08;感觉现在网上的AI图片…

泰迪智能科技实验室产品-云计算资源管理平台介绍

云计算资源管理平台是一款集群应用程序管理平台&#xff0c;以Docker、Kubernetes为核心引擎的容器化应用部署、运行环境&#xff0c;对数据中心的物理服务器、网络、存储、虚拟服务器等基础架构资源进行集中统一的管理、分配、监控等。平台旨在围绕行业应用逐步由“虚拟化”向…

llama-3 本地化部署实验

国产大模型的API 有限&#xff0c;编写langchain 应用问题很多。使用openai 总是遇到网络问题&#xff0c;尝试使用ollama在本地运行llama-3。结果异常简单。效果不错。llama-3 的推理能力感觉比openai 的GPT-3.5 好。 Ollama 下载 官网&#xff1a;https://ollama.com/downl…

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

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

llm学习2--使用embedding和数据处理

首先可以简单了解一下向量数据库相关知识&#xff1a; 向量数据库相关知识&#xff08;搬运学习&#xff0c;建议还是看原文&#xff0c;这个只是我自己的学习记录&#xff09;-CSDN博客 补充&#xff1a; 使用embedding API 文心千帆API Embedding-V1是基于百度文心大模型…

微服务应用与开发知识点练习【Gateway,OpenFeign,Dubbo,RocketMQ和RabbitMQ,JPA,Redis,Mycat】

一、选择题 【Gateway】 1.Spring Cloud Gateway与Nacos整合实现负载均衡时&#xff0c;路由配置中的URI前缀应该是&#xff1f;&#xff08;A &#xff09; A. lb:// B. nacos:// C. http:// D. discovery:// Spring Cloud Gateway与Nacos整合实现负载均衡时&#xff0c…

【Linux系统编程】进程控制(创建、退出、等待、替换)

目录 再聊进程创建 进程终止 进程等待 进程程序替换 再聊进程创建 初识进程创建 关于进程创建&#xff0c;这里只会说结论&#xff0c;在上面这篇文章中对进程创建进行了比较详细的阐述&#xff0c;而接下来要介绍的&#xff0c;都是基于上文说过的来展开的 一些较为重要…

【FFmpeg】avformat_alloc_output_context2函数

【FFmpeg】avformat_alloc_output_context2函数 1.avformat_alloc_output_context21.1 初始化AVFormatContext&#xff08;avformat_alloc_context&#xff09;1.2 格式猜测&#xff08;av_guess_format&#xff09;1.2.1 遍历可用的fmt&#xff08;av_muxer_iterate&#xff0…

Bad owner or permissions on C:\\Users\\username/.ssh/config > 过程试图写入的管道不存在。

使用windows连接远程服务器出现Bad owner or permissions 错误 问题&#xff1a; 需要修复文件权限 SSH 配置文件应具有受限权限以防止未经授权的访问 确保只有用户对该.ssh/config文件具有读取权限 解决方案&#xff1a; 在windows下打开命令行&#xff0c;通过以下命令打开文…