MySQL 基础知识(十)之 MySQL 架构

目录

1 MySQL 架构说明

2 连接层

3 核心业务层

3.1 查询缓存

3.2 解析器

3.3 优化器

3.4 执行器

4 存储引擎层

5 参考文档


1 MySQL 架构说明

下图是 MySQL 5.7 及其之前版本的逻辑架构示意图

MySQL 架构大致可分为以下三层:

  • 连接层:负责跟客户端建立连接、获取权限、维持和管理连接
  • 核心业务层:包括查询缓存、解析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等
  • 存储引擎层:负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎

2 连接层

MySQL 连接层是 MySQL 数据库架构中的一个重要组成部分,它主要负责处理客户端与数据库服务器之间的连接和通信。

主要作用为:

  • 连接管理:连接层负责监听客户端的连接请求,当客户端请求连接时,连接层会创建一个新的连接或者复用已有的空闲连接,以供客户端使用。在客户端使用完连接后,连接层会关闭连接以释放资源。为了提高性能和响应速度,连接层通常会实现一个线程池,线程池可以减少创建和销毁线程的开销,因为线程可以被重复使用
  • 通信协议处理:连接层处理客户端与数据库服务器之间的通信协议。它负责解析和处理客户端发送的请求,并将请求转换为数据库服务器能够理解的格式。同时,它也将数据库服务器的响应转换为客户端能够理解的格式,并返回给客户端
  • 安全性管理:连接层负责处理数据库的安全性。它验证客户端的身份和权限,确保只有经过授权的客户端能够访问数据库。连接层还可以对客户端发送的数据进行加密和解密,以保护数据库中的敏感信息
  • 异常处理:连接层还负责处理数据库连接过程中的异常情况。它可以检测到连接超时、网络中断等异常情况,并采取相应的措施,如重新连接或返回错误信息给客户端

查看连接状态

通过 show processlist 或 show full processlist 命令可以查看连接状态

  • Id:线程 id
  • User:启动这个线程的用户
  • Host:发送请求的客户端的 IP 和端口号
  • db:当前命令在哪个库执行
  • Command:该线程正在执行的操作命令
    • Create DB:正在创建库操作
    • Drop DB:正在删除库操作
    • Execute:正在执行一个 Prepared Statement
    • Close Stmt:正在关闭一个 Prepared Statement
    • Query:正在执行一个语句
    • Sleep:正在等待客户端发送语句
    • Quit:正在退出
    • Shutdown:正在关闭服务器
  • Time:表示该线程处于当前状态的时间,单位是秒
  • State:线程状态
    • Updating:正在搜索匹配记录,进行修改
    • Sleeping:正在等待客户端发送新请求
    • Starting:正在执行请求处理
    • Checking table:正在检查数据表
    • Closing table : 正在将表中数据刷新到磁盘中
    • Locked:被其他查询锁住了记录
    • Sending Data:正在处理 Select 查询,同时将结果发送给客户端
  • Info:一般记录线程执行的语句,默认显示前100个字符。想查看完整的使用 show full processlist;
# 查看连接状态
show processlist;

3 核心业务层

3.1 查询缓存

        当 MySQL 接收到一个查询请求时,它首先会检查查询缓存中是否已经存在与该查询请求相同的查询结果。之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。其中 key 是查询的语句,value 是查询的结果。如果存在,MySQL 会直接返回缓存中的结果,而不需要再执行查询语句。如果查询缓存中没有该查询结果,MySQL 会执行查询语句并将结果存储在查询缓存中,以便下次相同的查询可以直接从缓存中获取结果。我们一般不使用查询缓存,因为一旦查询涉及的表发生改变,该缓存会失效,会被查询缓存清除。从 MySQL 8.0 版本开始,MySQL 不再支持查询缓存。

3.2 解析器

        MySQL 首先会进行词法分析 (Lexical scanner),将 SQL 语句分成一个个的词法单元 (Token) 。其中 Token 中包含 Keyword(也称 symbol)和非 Keyword。之后根据语法分析 (Grammar rule module) 生成一棵对应的“解析树”。最后进行语义分析,检查“解析树”中的元素是否在数据库中有对应的实体,并验证操作的合法性。例如会检查数据表和数据列是否存在,还会解析名字和别名,看看它们是否有歧义,最后生成新的“解析树”。

3.3 优化器

        优化器会根据“解析树”生成最优的执行计划。这些执行计划可以分为两类:静态优化(编译时优化)、动态优化(运行时优化)。

        MySQL 能够处理的优化类型:

  • 重新定义关联表的顺序
  • 将外连接转化为内连接
  • 使用等价变换规则简化并规范 SQL 语句,如(5 = 5 AND  a > 5) 会被改写成 a > 5
  • 预估并转化为常数表达式,当 MySQL 检测到一个表达式可以转化为常数时,会一直把该表达式作为常数进行优化处理,如在索引列执行 COUNT()、MIN() 和 MAX()
  • 子查询优化,减少数据访问次数
  • 提前终止查询,当已经满足查询需求时,MySQL 能够立刻终止查询,如使用 LIMIT 子句或条件不成立时,立刻终止后续查询
  • 等值传播,如果两个列的值通过等式关联,MySQL 能够把其中一个列的 WHERE 条件传递到另一个列上
select g1.id,g1.name
from goods g1
inner join goods g2 using(id)
where g1.id > 5;

# where g1.id > 5 等价于 where g1.id > 5 and g2.id > 5
select g1.id,g1.name
from goods g1
inner join goods g2 using(id)
where g1.id > 5 and g2.id > 5;

   

  • 列表 IN() 的比较,如 IN(2,1,3),MySQL 会 IN() 列表中的数据进行排序,排序后为 IN(1,2,3),然后可以通过二分查找的方式确定列表中的值是否满足条件
3.4 执行器

        MySQL 执行器是 MySQL 服务器中的一个组件,它负责执行优化器生成的执行计划,并返回查询结果。

        MySQL 执行器的主要职责包括:

  • 执行查询计划:根据优化器生成的执行计划,执行器会执行相应的操作,如读取数据、连接表、执行排序、聚合等
  • 处理数据:执行器会从存储引擎中读取数据,并对数据进行处理,如过滤、排序、分组等
  • 返回结果:执行器会将处理后的数据返回给客户端,通常以行的形式返回
  • 管理事务:执行器会负责管理事务的提交和回滚,确保数据的一致性和完整性
  • 处理错误:如果在执行过程中发生错误,执行器会捕获错误并将其返回给客户端

执行一条 SQL 语句的过程

4 存储引擎层

        MySQL 存储引擎是 MySQL 数据库的核心组件之一,它负责管理数据的存储和访问。MySQL 支持多种存储引擎,每个存储引擎都有自己的特点和适用场景。常见的存储引擎包括:

  • InnoDB:InnoDB 是 MySQL 的默认存储引擎,它支持事务、热备份(可以在不停机的情况下进行数据备份)、行级锁、外键约束等特性,适用于大多数应用场景
  • MyISAM:MyISAM 是 MySQL 的早期存储引擎,它支持快速的读取和插入操作,但不支持事务和外键约束
  • Memory:Memory 存储引擎将数据存储在内存中,适用于需要快速访问数据的场景,但数据在服务器重启后会丢失
  • CSV:CSV 存储引擎将数据存储为 CSV 文件,适用于需要导入和导出数据的场景
  • Archive:Archive 存储引擎用于存储归档数据,支持快速的插入和压缩操作,但不支持索引和查询

存储引擎层的主要职责包括:

  • 管理数据存储:存储引擎负责将数据存储在磁盘上,并提供高效的数据访问方式
  • 支持索引:存储引擎负责管理索引的创建、维护和查询
  • 处理事务:存储引擎支持事务的原子性、一致性、隔离性和持久性
  • 提供数据恢复:存储引擎负责在服务器崩溃或意外关闭后,恢复数据的完整性
  • 优化查询性能:存储引擎会根据查询条件和索引,选择最优的查询计划来提高查询性能

5 参考文档

《高性能MySQL》

深入浅出MySQL - 架构与执行 (https://www.cnblogs.com/novwind/p/17489997.html)

MySQL架构原理(详解) (https://cloud.tencent.com/developer/article/1981543)

MySQL架构详解 (https://mdnice.com/writing/43f52aeaee9644b1bc1373ff85f89972)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

医疗在线问诊小程序:开启数字化医疗新篇章

随着科技的飞速发展,医疗行业正逐步向数字化转型。其中,医疗在线问诊小程序作为一种新型的医疗健康服务模式,为人们提供了更为便捷、高效的医疗咨询服务。本文将探讨医疗在线问诊小程序的发展背景、优势及应用场景,以期为医疗行业…

WebGL开发数据可视化应用

使用WebGL进行数据可视化可以创造出令人印象深刻的交互式和动态图形。以下是一些在WebGL中开发数据可视化应用时需要考虑的步骤和技术,希望对大家有所帮助。 1.选择合适的WebGL框架或库: 使用现有的WebGL框架或库,如Three.js、Babylon.js、r…

在Ubuntu中使用python

目录 一、利用vim使用python 1、下载vim 2、使用vim创建python文件 3、编辑完成后的vim操作 4、如何运行 5、vim常见操作 二、安装Jupyter 1、更新系统 2、安装pip 注:pip无法应用的原因及解决方案 3、安装Jupyter 4、打开Jupyter 三、安装其他Python模…

qt-交通路口仿真

qt-交通路口仿真 一、演示效果二、核心代码三、程序链接 一、演示效果 二、核心代码 #include "generator.h"Generator::Generator(SimulationScene *scene):m_scene(scene),m_mode(VEHICLEMETHOD::GO_THROUGH),m_running_state(false),m_VisionOn(false),m_IsInter…

type- C口桌面显示器的重要性

添加图片注释,不超过 140 字(可选) 桌面显示器在现代生活和工作中的重要性不容忽视。选择一款适合自己需求的显示器,不仅可以提高工作效率,还能保护视力,提升生活质量。 桌面显示器的视觉体验&#xff1a…

OpenAI视频生成模型Sora的全面解析:从ViViT、Diffusion Transformer到NaViT、VideoPoet

前言 真没想到,距离视频生成上一轮的集中爆发(详见《Sora之前的视频生成发展史:从Gen2、Emu Video到PixelDance、SVD、Pika 1.0》)才过去三个月,没想OpenAI一出手,该领域又直接变天了 自打2.16日OpenAI发布sora以来(其开发团队包…

C++ 网络编程学习一

C网络编程学习一 基本流程Boost网络库节点创建bufferasio tcp同步写asio tcp同步读同步阻塞方式的读写demo 基本流程 单线程流程中,服务器创建用于监听的套接字,绑定本地的ip和端口,listen函数去监听绑定的端口。 如果有客户端进行连接…

【ARMv8M Cortex-M33 系列 8.1 -- RT-Thread 堆内存 检查命令 free 实现及介绍】

文章目录 RT-Thread 堆内存 检查命令 free 实现及介绍rt_memory_info 函数验证 RT-Thread 堆内存 检查命令 free 实现及介绍 在RT-Thread系统中,通常可以通过rt_memory_info函数获取当前的堆内存使用信息,然后你可以包装这个函数来显示剩余的堆空间。rt…

SIMATIC S7-1200 PID串级控制(以巧克力加热炉温度控制为例)

文章目录 一、PID控制原理二、PID控制指令1.PID_Compact2.PID_3Step3.PID_Temp4.指令块功能对比 三、PID控制示例1.调用并组态PID_Compact2.调用被控对象仿真块3.进行预调节4.进行精确调节 四、串级控制1.调用并组态PID_Temp2.调用被控对象仿真块3.进行从控制器预调节加热4.进行…

HTML 字符实体参考清单

前言 一些字符在 HTML 中是预留的&#xff0c;拥有特殊的含义&#xff0c;比如小于号‘<’用于定义 HTML 标签的开始。如果我们希望浏览器正确地显示这些字符&#xff0c;我们必须在 HTML 源码中插入字符实体。 字符实体有三部分&#xff1a;一个和号‘&’和一个实体名…

DC电源模块在太阳能系统中的应用及优化

BOSHIDA DC电源模块在太阳能系统中的应用及优化 BOSHIDA DC电源模块在太阳能系统中有广泛的应用&#xff0c;主要用于转换太阳能电池板产生的直流电能为可用的电源。太阳能系统的优化主要集中在提高转换效率、稳定输出电压和延长电源模块的寿命等方面。 在太阳能系统中&…

图的遍历(广度优先遍历BFS,深度优先遍历DFS)

目录 图的遍历概念&#xff1a; 图的广度优先遍历&#xff08;BFS&#xff09;&#xff1a; 代码实现如下&#xff1a; 测试如下&#xff1a; 注意&#xff1a; 图的深度优先遍历&#xff08;DFS&#xff09;&#xff1a; 代码实现如下&#xff1a; 测试如下&#xff1…

护眼台灯哪个牌子好?好用又不伤眼的护眼台灯推荐

现在的孩子近视率非常高&#xff0c;如今不少低年级的孩子都已经存在近视的现象&#xff0c;究其原因主要还是学业压力过大、用眼时间过长、以及不合适的光源环境导致的。其中尤为注意孩子学习时书桌上的那一盏台灯&#xff0c;因为很多低质量的台灯在光源控制方面存在较大问题…

三防平板丨手持工业平板丨ONERugged工业三防平板丨推动数字化转型

随着科技的发展&#xff0c;数字化转型已经成为企业转型升级的必由之路。而在数字化转型中&#xff0c;三防平板作为一种重要的工具&#xff0c;可以极大地推动企业的数字化转型。本文将从以下几个方面探讨三防平板如何推动数字化转型。 一、提高工作效率 ONERugged加固平板的…

Vue+OpenLayers7入门到实战:OpenLayers加载google街景地图瓦片到地图上

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7 前言 本章介绍如何使用OpenLayers7在地图上加载google街景地图瓦片,无需科学上网,也可以正常访问瓦片。 二、依赖和使用 "ol": "7.5.2"使用npm安装依赖npm install ol@7.5.2使用Yarn安装依赖yarn a…

【Java】数据类型与变量

1.数据类型 在Java中数据类型主要分为两类&#xff1a;基本数据类型和引用数据类型。 基本数据类型有四类八种&#xff1a; 四类&#xff1a;整型、浮点型、字符型以及布尔型八种&#xff1a; 注意&#xff1a;不论是在16位系统还是32位系统&#xff0c;int都占用4个字节&am…

【Go-Zero】goctl生成model层后报错Unresolved reference ‘ErrNotFound‘解决方案

【Go-Zero】goctl生成model层后报错Unresolved reference ErrNotFound’解决方案 大家好 我是寸铁&#x1f44a; 总结了一篇goctl生成model层后报错Unresolved reference ErrNotFound’报错解决方案的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 问题背景 大家好&#xff…

【医学大模型 补全主诉】BioGPT + LSTM 自动补全医院紧急部门主诉

BioGPT LSTM 自动补全医院紧急部门主诉 问题&#xff1a;针对在紧急部门中自动补全主诉的问题子问题1: 提高主诉记录的准确性子问题2: 加快主诉记录的速度子问题3: 统一医疗术语的使用子问题4: 减少打字错误和误解子问题5: 提高非特定主诉的处理能力 解法数据预处理神经网络方…

centos中安装go

安装过程 &#xff08;1&#xff09;源码二进制下载地址 wget https://dl.google.com/go/go1.13.5.linux-amd64.tar.gz &#xff08;2&#xff09;将下载的二进制包解压至 /usr/local目录。 tar -C /usr/local/ -xzf go1.13.5.src.tar.gz &#xff08;3&#xff09;设置环…

《基于CEEMDAN一小波包自适应阈值混凝土声发射信号降噪研究》算法思路笔记

![1]杨智中,林军志,汪魁等.基于CEEMDAN-小波包自适应阈值混凝土声发射信号降噪研究[J].振动与冲击,2023,42(03):139-149.DOI:10.13465/j.cnki.jvs.2023.03.016.](https://img-blog.csdnimg.cn/direct/9814ff64cc474cd3aa06ecaea60f2f75.png) 首先对周期循环荷载作用下混凝土试…