对 MYSQL 架构的了解

embedded/2024/12/26 17:58:04/

MySQL 是一种广泛使用的关系型数据库管理系统,其架构主要包括以下几个关键部分:

一、连接层

客户端连接管理:MySQL 服务器可以同时处理多个客户端的连接请求。当客户端应用程序(如使用 Java、Python 等语言编写的程序)尝试连接到 MySQL 服务器时,连接层负责建立连接。它会验证客户端提供的用户名、密码等认证信息,只有认证通过的客户端才能成功建立连接。例如,一个 Web 应用服务器要访问 MySQL 数据库存储用户信息,就需要先在连接层进行身份验证。

通信协议处理:MySQL 使用自己的通信协议来在客户端和服务器之间传递数据和命令。连接层负责解析客户端发送的 SQL 语句请求,并将服务器的响应结果按照协议格式返回给客户端。

二、服务层(SQL 层)

查询解析器(Parser)

词法分析:当客户端发送 SQL 语句后,查询解析器首先会对 SQL 语句进行词法分析。它会将 SQL 语句分解为一个个的单词(Token),比如 SELECT、FROM、WHERE 等关键字,以及表名、列名、数值等标识符。例如,对于语句 “SELECT * FROM users WHERE age> 18”,会分解出 “SELECT”“*”“FROM”“users”“WHERE”“age”“>”“18” 这些单词。

语法分析:在词法分析的基础上,语法分析器会根据 MySQL 的语法规则来检查 SQL 语句的语法结构是否正确。如果 SQL 语句不符合语法规则,就会返回语法错误信息给客户端。例如,语句 “SELECT * FORM users”(错误地拼写了 FROM)就会被语法分析器检测出错误。

查询优化器(Optimizer)

成本估算:优化器会对解析后的 SQL 查询计划进行评估。它会考虑多种因素来估算不同执行计划的成本,如索引的使用情况、表的连接方式(如内连接、外连接)、数据量大小等。例如,对于一个涉及多表连接的查询,优化器会分析是先连接哪两个表成本更低。

生成最优执行计划:基于成本估算,优化器会选择一个它认为是最优的执行计划来执行 SQL 查询。这个执行计划可能包括决定使用哪些索引、以何种顺序访问表等。例如,在一个有索引的表上进行查询时,优化器会判断是否使用索引来提高查询速度。

查询执行器(Executor)

根据优化器生成的执行计划,查询执行器负责实际执行 SQL 查询操作。它会与存储引擎进行交互,读取或写入数据。例如,执行一个 SELECT 语句时,执行器会从存储引擎中获取符合条件的数据行,然后将这些数据返回给服务层进行后续处理。

事务管理:MySQL 支持事务处理,执行器在处理事务相关的 SQL 语句(如 BEGIN、COMMIT、ROLLBACK 等)时,会负责协调事务的开始、提交和回滚操作。它确保事务的原子性、一致性、隔离性和持久性(ACID)特性。例如,在一个银行转账事务中,如果转账操作失败,执行器会根据事务的回滚机制,将数据恢复到转账之前的状态。

三、存储引擎层

存储引擎概述:MySQL 支持多种存储引擎,如 InnoDB、MyISAM、Memory 等。不同的存储引擎有不同的特点,适用于不同的应用场景。存储引擎负责数据的存储和读取操作。

InnoDB 存储引擎(常用)

存储结构:InnoDB 采用聚簇索引(Clustered Index)来存储数据。聚簇索引的叶子节点存储了实际的数据行,而非聚簇索引的叶子节点存储的是指向聚簇索引的指针。例如,在一个以主键为聚簇索引的表中,数据行按照主键值的顺序存储在磁盘上。

事务支持:InnoDB 是支持事务的存储引擎,通过事务日志(Redo Log 和 Undo Log)来保证事务的 ACID 特性。Redo Log 用于在系统崩溃后恢复已经提交的事务修改,Undo Log 用于回滚未完成的事务。

行级锁:InnoDB 支持行级锁,这使得在多用户并发访问数据库时,可以更精细地控制并发操作。例如,当多个用户同时对同一张表中的不同行进行更新操作时,行级锁可以减少锁冲突,提高并发性能。

MyISAM 存储引擎

存储结构:MyISAM 存储引擎的数据文件和索引文件是分开存储的。数据文件存储实际的数据行,索引文件存储索引信息。这种存储方式使得在某些情况下,索引的维护和数据的读写操作相对简单。

性能特点:MyISAM 在查询操作频繁、对事务支持要求不高的场景下有较好的性能。但是它不支持事务,也不支持行级锁,只支持表级锁。例如,在一个以读为主的数据库应用中,如果不需要事务处理,MyISAM 可能是一个选择。

四、缓存层

查询缓存(早期版本有,较新版本已逐渐废弃):在早期的 MySQL 版本中,查询缓存用于存储查询结果。当一个新的查询到来时,服务器会先检查查询缓存中是否已经存在相同的查询结果。如果存在,就直接从缓存中返回结果,而不需要再次执行查询。但是,由于缓存失效机制复杂,在高并发和频繁更新数据的场景下,查询缓存可能会带来性能问题,所以在较新版本中逐渐被弱化。

缓冲池(Buffer Pool):InnoDB 存储引擎等有缓冲池机制。缓冲池是一块内存区域,用于缓存从磁盘读取的数据页和索引页。当查询需要读取数据时,如果数据已经在缓冲池中,就可以直接从内存中获取,大大提高了查询速度。缓冲池会根据一定的算法(如 LRU,最近最少使用算法)来管理内存中的数据页,将经常访问的数据页保留在缓冲池中,将不经常访问的数据页淘汰出缓冲池。


http://www.ppmy.cn/embedded/148955.html

相关文章

Llama 3 模型系列解析(一)

目录 1. 引言 1.1 Llama 3 的简介 1.2 性能评估 1.3 开源计划 1.4 多模态扩展 ps 1. 缩放法则 2. 超额训练(Over-training) 3. 计算训练预算 4. 如何逐步估算和确定最优模型? 2. 概述 2.1 Llama 3 语言模型开发两个主要阶段 2.2…

云手机+YouTube:改变通信世界的划时代技术

随着科技的不断进步,手机作为人们生活中不可或缺的工具,也在不断地更新换代。近年来,一个名为“油管云手机”的全新产品正在引起广泛的关注和讨论。作为一个运用最新科技实现的新型手机,它在通信领域带来了全新的体验和革命性的变…

从汽车企业案例看仓网规划的关键步骤(视频版)

大家好,欢迎收看本期视频。本期内容将以汽车行业为例,带您了解仓库选址和仓网规划如何解决实际问题,以及需要注意的关键步骤。 案例描述 国内某大型汽车企业目前在全国范围内拥有十多个生产厂地和近千家供应商。这些供应商分布在多个地理区…

errant是怎么产生的

目录 1.产生errant GTID的原因2.检查errant GTID3.处理errant GTID方式一 忽略errant GTID方式二 重置从库方式三 注入空事务 在MySQL中,errant GTID(错误GTID)是指在从库上存在但在主库上不存在的GTID。 这通常是由于在从库上执行了不应存在…

Gemini 2.0:面向智能体时代的全新 AI 模型

2024年12月11日,Google 发布了 Gemini 2.0 系列的首个模型——Gemini 2.0 Flash(实验版)。凭借多模态方面的新进展以及原生工具的使用,Gemini 2.0 Flash (实验版) 能够构建新的 AI 智能体,推动了实现通用 AI 助手愿景的…

界面化管理Nginx的工具—NginxUI简介与搭建

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 1. NginxUI简介 1.1 NginxUI介绍 Nginx UI 是一个全新的 Nginx 网络管理界面,旨在简化 Nginx 服务器的管理和配置。…

UI自动化测试实战实例

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 今天来说说pytest吧,经过几周的时间学习,有收获也有疑惑,总之最后还是搞个小项目出来证明自己的努力不没有白费。 环境准备 1…

什么是Web Worker?如何使用Web Worker?

1. 什么是 Web Worker? JavaScript 语言采用的是单线程的,也就是说,所有任务只能在一个线程上完成,一次只能做一件事。前面的任务没做完,后面的任务只能等着。 Web Worker 是一种在浏览器中实现多线程处理的技术&…