【MySQL】基础架构分析

考察频率难度
40%⭐⭐⭐⭐

这道题在面试时的出现频率其实并不高,最起码对于笔者来说是没有遇到过。那为什么还是选择把这个问题作为 MySQL 八股文系列的第一个呢?其实原因也挺简单的,还是老规矩,先通过一个问题把整个知识框架来一个概览。

完整地理解 MySQL 的基础架构有助于后面理解很多问题,这些在后面的学习过程中你就会有所感受。闲话少说,直接开始正文吧。

基本架构示意图

先简单介绍一下下图涉及的一些组件的基本作用帮助大家理解这幅图,在下面中会详细介绍到这些组件的作用。

  • 连接器: 身份认证和权限相关(登录 MySQL 的时候)。
  • 查询缓存: 执行查询语句的时候,会先查询缓存(MySQL 8.0 版本后移除,因为这个功能不太实用)。
  • 分析器: 没有命中缓存的话,SQL 语句就会经过分析器,分析器说白了就是要先看你的 SQL 语句要干嘛,再检查你的 SQL 语句语法是否正确。
  • 优化器: 按照 MySQL 认为最优的方案去执行。

大体来说,MySQL 可以分为 Server层 和 存储引擎 两部分

Server层 包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。

存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持InnoDB、MyISAM、 Memory等多个存储引擎。现在最常用的存储引擎是InnoDB,它从MySQL 5.5.5版本开始成为了默认存储引擎。不同的存储引擎共用一个Server层,也就是从连接器到执行器的部分。

Server层

连接器

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;

查询缓存

查询缓存主要用来缓存我们所执行的 SELECT 语句以及该语句的结果集。

连接建立后,执行查询语句的时候,会先查询缓存,MySQL 会先校验这个 sql 是否执行过,以 Key-Value 的形式缓存在内存中,Key 是查询预计,Value 是结果集。如果缓存 key 被命中,就会直接返回给客户端,如果没有命中,就会执行后续的操作,完成后也会把结果缓存起来,方便下一次调用。当然在真正执行缓存查询的时候还是会校验用户的权限,是否有该表的查询条件。

MySQL 查询不建议使用缓存,因为查询缓存失效在实际业务场景中可能会非常频繁,假如你对一个表更新的话,这个表上的所有的查询缓存都会被清空。对于不经常更新的数据来说,使用缓存还是可以的。

所以,一般在大多数情况下我们都是不推荐去使用查询缓存的。

MySQL 8.0 版本后删除了缓存的功能,官方也是认为该功能在实际的应用场景比较少,所以干脆直接删掉了。

MySQL 8.0 之前可以正常的使用查询缓存的功能,可通过 “SHOW  VARIABLES LIKE '%query_cache_type%'” 命令查询数据库是否开启了查询缓存的功能。

它的结果值有以下三项:

  • OFF,关闭了查询缓存功能;
  • ON,开启了查询缓存功能;
  • DEMAND,在 sql 语句中指定 sql_cache 关键字才会有查询缓存,也就是说必须使用 sql_cache 才可以把该 select 语句的查询结果缓存起来,比如“select SQL_CACHE * from T where ID=10;”语句。

开启和关闭查询缓存可以通过修改 MySQL 的配置文件 my.cnf 进行修改,它的配置项如下:

query_cache_type = ON

注意:配置被更改之后需要重启 MySQL 服务才能生效。建议设置为按需缓存(DEMAND)模式,因为查询缓存的功能并不是那么好用。

分析器

MySQL 没有命中缓存,那么就会进入分析器,分析器主要是用来分析 SQL 语句是来干嘛的,分析器也会分为几步:

  • 第一步,词法分析,一条 SQL 语句有多个字符串组成,首先要提取关键字,比如 select,提出查询的表,提出字段名,提出查询条件等等。做完这些操作后,就会进入第二步。
  • 第二步,语法分析,主要就是判断你输入的 sql 是否正确,是否符合 MySQL 的语法。

完成这 2 步之后,MySQL 就准备开始执行了,但是如何执行,怎么执行是最好的结果呢?这个时候就需要优化器上场了。

优化器

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

MySQL 能够处理的优化类型:

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

执行器

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

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

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

存储引擎

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

常见的存储引擎包括

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

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

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

一条 sql 语句是如何执行的?

综合上面对 MySQL 基础架构的分析,我们来看一个比较高频的面试题——一条 sql 语句是如何执行的?

  • 客户端通过连接器与MySQL服务器建立连接、获取权限、维持和管理连接
  • 查询缓存,如果开启查询缓存,则先去缓存哈希表查找数据,如果命中缓存,则直接返回数据给客户端;如果没有命中缓存,则继续执行下面逻辑;
  • 解析器通过 词法分析语法分析 验证SQL是否合法,并生成相应“语法树”;并通过预处理器进一步检查”语法树“是否合法;
  • 接着,优化器将语法树转化成执行计划。执行计划决定了执行器会选择存储引擎的哪个方法去获取数据。MySQL使用基于成本的优化器,它会尝试预测一个查询使用某种执行计划时的成本,并选择其中成本最小的一个。
  • 执行器负责根据这个执行计划调用存储引擎的API接口来完成整个查询工作。
  • MySQL将结果集增量、逐步返回给客户端,如果开启了查询缓存,MySQL在这个阶段会将结果放到查询缓存中。


🎉 如果这篇文章对你有帮助,点赞👍 收藏⭐ 关注✅ 哦,创作不易,感谢!😀 

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

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

相关文章

【已解决】【记录】2AI大模型web UI使用tips 本地

docker desktop使用 互动 如果需要发送网页链接,就在链接上加上【#】号 如果要上传文件就点击这个➕号 中文回复 命令它只用中文回复,在右上角打开【对话高级设置】 输入提示词(提示词使用英文会更好) Must reply to the us…

热烈祝贺“钛然科技”选择使用订单日记

感谢珠海钛然科技有限公司选择使用订单日记! 珠海钛然科技有限公司,成立于2020年,位于广东省珠海市高新区,是一家以从事研发和生产功能型纳米高分子涂层为主的企业。 在业务不断壮大的过程中,想使用一种既能提升运营…

Linux-----进程通讯(消息队列)

目录 相关API 1.相关数据类型 mqd_t struct mq_attr struct timespec 2.相关系统调用接口 mq_open() mq_timedsend() && mq_send() mq_timedreceive() && mq_receive() mq_unlink() clock_gettime() 父子进程使用消息队列通讯 平行进程使用消息队列…

【微服务】面试题 5、分布式系统理论:CAP 与 BASE 详解

分布式系统理论:CAP 与 BASE 详解 一、CAP 定理 背景与定义:1998 年由加州大学科学家埃里克布鲁尔提出,分布式系统存在一致性(Consistency)、可用性(Availability)、分区容错性(Part…

数据结构与算法之二叉树: LeetCode 572. 另一棵树的子树 (Ts版)

另一棵树的子树 https://leetcode.cn/problems/subtree-of-another-tree/description/ 描述 给你两棵二叉树 root 和 subRoot检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树如果存在,返回 true ;否则,返回 false二叉树 tree …

NineData云原生智能数据管理平台新功能发布|2024年12月版

本月发布 7 项更新,其中重点发布 2 项、功能优化 5 项。 重点发布 数据库 Devops - Oracle 非表对象支持可视化创建与管理 Oracle 非表对象,包括视图(View)、包(Package)、存储过程(Procedur…

[Unity]MacOS下开发Unity

需要的插件 我使用的是vscode,经过长时间的使用我发现一个问题就是很多插件都是动态的在变化的,不是一成不变的,可能是重构,可能直接换了其他的工具。 所以这个插件也会是更新的状态。 2025年01月08日更新 .NET Install Tool (…

项目开发实践——基于SpringBoot+Vue3实现的在线考试系统(五)

文章目录 一、学生管理模块功能实现1、添加学生功能实现1.1 页面设计1.2 前端功能实现1.3 后端功能实现1.4 效果展示2、学生管理功能实现2.1 页面设计2.2 前端功能实现2.3 后端功能实现2.3.1 后端查询接口实现2.3.2 后端编辑接口实现2.3.3 后端删除接口实现2.4 效果展示二、代码…

实现一个VSCode插件(从创建到发布)

实现一个自己的VSCode 插件 本文将以 yo 为例, 实现一个 VS Code 插件 从创建到发布。 文章目录 实现一个自己的VSCode 插件1. 初始化项目2. 项目结构3. 实现插件功能4. 测试和运行插件5. 发布6. 下载自己发布的插件 1. 初始化项目 首先,我们需要安装 …

Unity TextMesh Pro入门

概述 TextMesh Pro是Unity提供的一组工具,用于创建2D和3D文本。与Unity的UI文本和Text Mesh系统相比,TextMesh Pro提供了更好的文本格式控制和布局管理功能。 本文介绍了TMP_Text组件和Tmp字体资产(如何创建字体资产和如何解决缺字问题),还有一些高级功…

【教程】数据可视化处理之2024年各省GDP排名预测!

过去的一年里,我国的综合实力显著提升,在新能源汽车、新一代战机、两栖攻击舰、航空航天、芯片电子、装备制造等领域位居全球前列。虽然全国各省市全年的经济数据公布还需要一段时间,但各地的工业发展数据,财政收入数据已大概揭晓…

后端:Spring(IOC、AOP)

文章目录 1. Spring2. IOC 控制反转2-1. 通过配置文件定义Bean2-1-1. 通过set方法来注入Bean2-1-2. 通过构造方法来注入Bean2-1-3. 自动装配2-1-4. 集合注入2-1-5. 数据源对象管理(第三方Bean)2-1-6. 在xml配置文件中加载properties文件的数据(context命名空间)2-1-7. 加载容器…

从CentOS到龙蜥:企业级Linux迁移实践记录(龙蜥开局)

引言: 在我们之前的文章中,我们详细探讨了从CentOS迁移到龙蜥操作系统的基本过程和考虑因素。今天,我们将继续这个系列,重点关注龙蜥系统的实际应用——特别是常用软件的安装和配置。 龙蜥操作系统(OpenAnolis&#…

一.项目课题 <基于TCP的文件传输协议实现>

客户端代码 需要cJSON.c文件和cJSON.h文件 在这里插入代码片#include "myheadth.h" #include "myfun.h"#define TIME 10 int sockfd; void heartbeat(int signum) {cJSON* root cJSON_CreateObject();cJSON_AddStringToObject(root,"request"…

Type-C双屏显示器方案

在数字化时代,高效的信息处理和视觉体验已成为我们日常生活和工作的关键需求。随着科技的进步,一款结合了便携性和高效视觉输出的设备——双屏便携屏,逐渐崭露头角,成为追求高效工作和娱乐体验人群的新宠。本文将深入探讨双屏便携…

计算机视觉算法实战——车道线检测

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​​​​ ​​​​​​​​​​​​ ​​​​​ 车道线检测是计算机视觉领域的一个重要研究方向,尤其在自动驾驶和高级驾驶辅助…

【微服务】面试 3、 服务监控 SkyWalking

微服务监控的原因 问题定位:在微服务架构中,客户端(如 PC 端、APP 端、小程序等)请求后台服务需经过网关再路由到各个微服务,服务间可能存在多链路调用。当某一微服务挂掉时,在复杂的调用链路中难以迅速确定…

【MySQL数据库】基础总结

目录 前言 一、概述 二、 SQL 1. SQL通用语法 2. SQL分类 3. DDL 3.1 数据库操作 3.2 表操作 4. DML 5. DQL 5.1 基础查询 5.2 条件查询 5.3 聚合函数 5.4 分组查询 5.5 排序查询 5.6 分页查询 6. DCL 6.1 管理用户 6.2 权限控制 三、数据类型 1. 数值类…

aws(学习笔记第二十三课) step functions进行开发(lambda函数调用)

aws(学习笔记第二十三课) 开发step functions状态机的应用程序 学习内容: step functions状态机的概念开发简单的step functions状态机 1. step functions状态机概念 官方说明文档和实例程序 AWS的官方给出了学习的链接和实例程序。使用SAM创建step functions 借…

【Docker】入门教程

目录 一、Docker的安装 二、Docker的命令 Docker命令实验 1.下载镜像 2.启动容器 3.修改页面 4.保存镜像 5.分享社区 三、Docker存储 1.目录挂载 2.卷映射 四、Docker网络 1.容器间相互访问 2.Redis主从同步集群 3.启动MySQL 五、Docker Compose 1.命令式安装 …