MySQL架构长啥样?

MySQL服务器总共有四层:连接层,服务层,存储引擎层,文件系统层.

连接层:

就是控制客户端连接的,MySQL可以开启多个端口号,外部程序都可以进行连接.

连接层会进行权限校验并保存客户端的连接信息,通过池化技术实现线程重用,以及根据具体的配置限制连接数量.

通过连接管理器线程处理端口上的客户端连接请求:

1.在所有平台上,用一个管理器线程处理所有的 TCP/IP 连接请求。

2.在 Unix 上,管理器线程还可以处理其他Unix socket 连接请求。

3.在 Windows 上,使用一个管理器线程处理通过Shared-memory方式连接请求,使用另一个管理

器线程处理Named-pipe方式连接请求。

4.在所有平台上,可以额外启用一个端口用于接受针对管理的 TCP/IP 连接请求,管理端口的连接可以使用处理"普通" TCP/IP 请求的管理器线程,也可以通过选项文件配置单独的线程(不做论)。

连接管理器线程在接收到每个客户端连接后,把请求转发到真正的执行线程,每个请求都对应一

个执行线程,该线程处理连接的身份验证和具体请求。执行线程使用线程池技术进行缓存,当一个请求需要处理时,先从线程池中查找是否有可用的线程,如果没有则新创建一个,当连接结束时,如果线程池没有满,则把当前线程放入线程池,主要的作用是提高线程的复用,减少创建线程造成的系统开销从而提高效率。

可以通过以下几个系统变量和状态变量控制和监视服务器管理客户端连接的线程:

1.系统变量thread_cache_size 决定了线程池缓存的大小。默认情况下,服务器在启动时会自动

调整这个值,但也可以通过选项文件明确指定大小,值为 0 时禁用缓存,此时为每个新连接创建执

行一个线程,并在连接断开时释放;

2.有些复杂的SQL语句在执行过程中可能会有深层递归从而消耗更多的内存,通过设置

thread_stack=N 调整线程堆栈大小;

3.要查看缓存中的线程数以及超过缓存数后新创建的线程数,通过状态变量 Threads_cached 和

Threads_created 查看;

系统变量max_connections 可以控制服务器允许同时连接的最大客户端数,当服务器达到

max_connections 指定的连接数时会拒绝所有新的连接请求,同时会增加状态变量

Connection_errors_max_connections 的值;

mysqld实际上允许 max_connections+1 个客户端连接。额外的连接为拥有

CONNECTION_ADMIN 权限的帐户(管理员)使用,即使普通连接达到了max_connections 的

数量,管理员也可以连接到服务器进行管理操作;

在部署为主从复制的环境中,从节点的连接数也会计入 max_connections 中,如果连接达到上

限主从复制将会失败;

max_connections 具体数据和服务器的硬件有关,比如可用的内存、每个连接消耗的内存,每

个连接的工作负载、响应时间、可用文件描述符的数量等等

服务层

数据库服务层是整个数据库服务器的核心,主要包括了服务管理和公共组件、NoSQL和SQL接口、解析器、查询优化器和缓存等部分,下面我们分别介绍每个部分的作用:

NoSQL和SQL接口主要负责接收客户端发送的各种SQL语句和命令,并将SQL发送到其他部分,然后把接收到的结果返回给客户端。

语法分析器的主要作用是将客户端发来的SQL语句中的关键字和自定义字段进行提取、解析,最

终将 SQL 语句转换为一棵解析树,分析的过程中包含词法分析和语法分析;词法分析,主要是对关键字进行提取,比如select/update/delete/create... ;语法分析,主要判断 SQL 语句是否满

足语法规则,如果语法错误则异出异常,也就是我们常见的ERROR 1064 (42000): You have an

error in your SQL syntax。

Optimizer(查询优化器):通过语法校验的SQL语句将进入查询优化器处理阶段,查询优化器会将解析树转化为查询计划,一般情况下,一条查询可以有很多种执行方案,查询优化器会根据执行计划匹配合适的索引,选择最佳的执行方案,最终把确定要执行的SQL交给执行器调用存储引擎API。

MySQL的缓存主要的作用是为了提升查询的效率,当服务器接收到一个select 查询语句时,会

先进入缓存查询当前SQL语句在缓存中是否存在,缓存以key 和value 的形式存储,key是具体的

SQL语句,value是结果的集合,如果命中缓存,直接返回结果,无法命中缓存,则进入分析器进行正常查询流程。这里需要说明的是,缓存数据对应的数据在被更新之后将会失效,尤其在写多读少的场景中,缓存会频繁失效与新增,命中率非常低,因此MySQL5.6之后服务层缓存功能默认关闭,而且在MySQL8.0中服务层缓存被官方删除,这里不做过多讨论。

存储引擎

存储引擎是处理不同表类型SQL操作的MySQL组件。MySQL服务器采用可插拔的存储引擎架构,

在服务器运行时可以动态的加载和卸载。

查看当前服务器支持哪些存储引擎可以使用 SHOW ENGINES 语句, Engine 表示:存储引擎的

名称, Support :表示当前服务器是否支持,值分别为: YES 、NO 和DEFAULT 分别表示,支

持、不支持和当前设置或默认引擎

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

InnoDB 的主要优势

• DML操作遵循ACID模型,事务具有提交、回滚和崩溃恢复功能,以保护用户数据。

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

• 支持行级锁,提高了多用户的读取并发性和性能。事务和锁专题中介绍这里说不支持集群模式,是指Innodb不是用来专门做集群的存储引擎,但是支持集群的,就比如说主从复制

• InnoDB 存储引擎维护了一个自己的缓冲池,访问数据时在内存中缓存表和索引数据,对于经常

使用的数据直接从内存中处理,大幅提升了效率。在专用数据库服务器上,通常会将高达 80% 的

物理内存分配给缓冲池。

• InnoDB表优化了基于主键的查询,每个InnoDB表都有一个称为聚簇索引的主键索引,实现通过最少的磁盘I/O完成对主键的查找。

• 为了保持数据完整性, InnoDB 支持 FOREIGN KEY (外键)约束。在进行插入、更新和删除数据

时确保相关表之间的一致性

• 当从表中反复查询相同的行时,自适应哈希索引会自动接管这些查询,此时查询效率和哈希表相

同。

如果InnoDB不是默认的存储引擎,可以通过在命令行指定选项--default-storageengine=InnoDB 或者在选项文件的mysqld 节点定义default-storageengine=InnoDB 并重新启动服务器来设InnoDB 存储引擎

由于业务实际需要,服务器默认存储引擎不是InnoDB时,想要创建一个InnoDB表,可以在使用

CREATE TABLE 语句创建表时明确指定InnoDB存储引擎,当然这样方式也可以指定其他任何支

持的存储引擎

这里其他就不介绍了

文件系统层

这个就不详细说,看MySQL数据目录就行了.

相关推荐
阳光是sunny11 小时前
Vue 项目怎么做用户行为全链路监控?轻量插件方案详解
前端·面试·架构
EMA16 小时前
Docker虚拟化失败解决方案
架构
李斯维17 小时前
从历史的角度看 Android 软件架构
android·架构·android jetpack
JouYY19 小时前
聊一下多 Agent 编排架构的应用实践
架构·llm·agent
Sunia20 小时前
《AgentX 专栏》10-生产部署:3台2C4G云服务器把企业级Agent真正跑起来的完整方案
java·架构
ZhengEnCi2 天前
Q01-高并发点赞系统架构设计
架构
笨鸟飞不快2 天前
从 MVC 到 DDD:一次真实的渐进式迁移实录
后端·架构
这个DBA有点耶3 天前
GROUP BY优化全解:如何写出既不丢数据又飞快的分组查询
数据库·mysql·架构
锋行天下3 天前
我试图优化 Vite 的拆包,结果首屏慢了 10 倍
前端·vue.js·架构