对 MYSQL 架构的了解
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,最近最少使用算法)来管理内存中的数据页,将经常访问的数据页保留在缓冲池中,将不经常访问的数据页淘汰出缓冲池。
相关文章:
对 MYSQL 架构的了解
MySQL 是一种广泛使用的关系型数据库管理系统,其架构主要包括以下几个关键部分: 一、连接层 客户端连接管理:MySQL 服务器可以同时处理多个客户端的连接请求。当客户端应用程序(如使用 Java、Python 等语言编写的程序)…...
C#中方法参数传值和传引用的情况
对于引用类型 - 传类类型的具体值时 此时传的是引用 - 单纯传类类型 此时传的是个test引用的副本,在方法内修改的是这个副本的指向 传string,集合同理,只要是指向新对象,就是引用副本在指向 对于值类型 - 传普通值类型 …...
获取显示器(主/副屏)友好名称(FriendlyName)
在开发涉及多显示器的应用程序时,获取显示器的友好名称(Friendly Name)是一个常见需求。本文将深入探讨GetMonitorFriendlyName 方法,了解其实现细节和工作原理。 方法签名 public static string GetMonitorFriendlyName(bool i…...
Apache Solr RCE(CVE-2017-12629)--vulhub
Apache Solr 远程命令执行漏洞(CVE-2017-12629) Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。原理大致是文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个…...
2.3 携程的hook实现及dlsym函数
背景知识:(排除static 情况) 一个进程中可以有相同的命名吗? -- 不能 两个进程之间可以有相同的命名吗?--可以 一个进程和另一个静态库可以有相同的命名吗?--不能 一个进程和另一个动态库之间可以有相同…...
机器学习之KNN算法
K-Nearest Neighbors (KNN) 是一种常见的机器学习算法,广泛应用于分类和回归问题。KNN是一种基于实例的学习方法,它利用训练数据集的实例来进行分类或回归预测。在KNN中,预测的结果依赖于距离度量函数计算出的最近邻实例的标签或值。下面我们…...
《全排列问题》
题目描述 按照字典序输出自然数 11 到 nn 所有不重复的排列,即 nn 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。 输入格式 一个整数 nn。 输出格式 由 1∼n1∼n 组成的所有不重复的数字序列,每行一个序列。 每个数字保留…...
pycharm 快捷键
PyCharm 是一款功能强大的集成开发环境(IDE),提供了丰富的快捷键来提高开发效率。以下是一些常用的 PyCharm 快捷键(基于 Windows/Linux 系统,Mac 系统可能略有不同): 通用快捷键 功能快捷键&a…...
若依微服务如何获取用户登录信息
文章目录 1、需求提出2、应用场景3、解决思路4、注意事项5、完整代码第一步:后端获取当前用户信息第二步:前端获取当前用户信息 5、运行结果6、总结 1、需求提出 在微服务架构中,获取当前用户的登录信息是开发常见的需求。无论是后端处理业务…...
RunCam WiFiLink连接手机图传测试
RunCam WiFiLink中文手册从这里下载 一、摄像头端 1.连接天线(易忘) 2.打开摄像头前面的盖子(易忘) 3.接上直流电源,红线为正,黑线为负 4.直流电源设置电压为14v,电流为3.15A, 通…...
TCP三次握手,四次挥手
三次握手 第一次握手:客户端向服务器发送一个 SYN 包,其中 SYN 标志位被设置为 1,表示客户端请求建立连接,并随机生成一个初始序列号 seqx 。此时客户端进入 SYN_SENT 状态,等待服务器的确认1.第二次握手:服…...
Mono里建立调试C#脚本运行环境
前面已经介绍了怎么样来执行一个嵌入式的脚本框架, 这个框架是mono编写的一个简单的例子。 如果不清楚,可以参考前文: https://blog.csdn.net/caimouse/article/details/144632391?spm=1001.2014.3001.5501 本文主要来介绍一下,我们的C#脚本是长得怎么样的,它大体如下…...
Linux dnf 包管理工具使用教程
简介 dnf 是基于 Red Hat Linux 发行版的下一代包管理工具,它代替 yum 提供更好的性能、更好的依赖处理和更好的模块化架构。 基础语法 dnf [options] [command] [package] 常用命令用法 更新元数据缓存 sudo dnf check-update# 检查已安装的包是否有可用的更…...
Java 创建线程的方式有哪几种
在 Java 中,创建线程的方式有四种,分别是:继承 Thread 类、实现 Runnable 接口、使用 Callable 和 Future、使用线程池。以下是详细的解释和通俗的举例: 1. 继承 Thread 类 通过继承 Thread 类并重写 run() 方法来创建线程。 步…...
计算机的错误计算(一百八十七)
摘要 用大模型计算 sin(123.456789). 其自变量为弧度。结果保留16位有效数字。第一个大模型是数学大模型。先是只分析,不计算;后经提醒,才给出结果,但是是错误结果。第二个大模型,直接给出了Python代码与结果…...
12. 最大括号深度
题目描述 现有一字符串仅由"(",")", "{","}", "[", "]"六种括号组成。若字符串满足以下条件之一, 则为无效字符串:任一类型的左右括号数量不相等 存在未按正确顺序(先左后右)闭合的括号输出…...
进程与线程以及如何查看
长期补充,建议关注收藏! 定义 特性进程线程定义程序执行的基本单位执行中的最小单位资源拥有独立的内存空间和资源共享进程的资源开销创建和销毁的开销较大创建和销毁的开销较小执行单位进程中可以有多个线程线程是执行单元,必须依赖于进程并…...
BlueLM:以2.6万亿token铸就7B参数超大规模语言模型
一、介绍 BlueLM 是由 vivo AI 全球研究院自主研发的大规模预训练语言模型,本次发布包含 7B 基础 (base) 模型和 7B 对话 (chat) 模型,同时我们开源了支持 32K 的长文本基础 (base) 模型和对话 (chat) 模型。 更大量的优质数据 :高质量语料…...
Webpack学习笔记(4)
1.缓存 可以通过命中缓存降低网络流量,是网站加站速度更快。 然而在部署新版本时,不更改资源的文件名,浏览器可能认为你没有更新,所以会使用缓存版本。 由于缓存存在,获取新的代码成为问题。 接下来将配置webpack使…...
28、论文阅读:基于像素分布重映射和多先验Retinex变分模型的水下图像增强
A Pixel Distribution Remapping and Multi-Prior Retinex Variational Model for Underwater Image Enhancement 摘要介绍相关工作基于模型的水下图像增强方法:无模型水下图像增强方法:基于深度学习的水下图像增强方法: 论文方法概述像素分布…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...
实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
加密通信 + 行为分析:运营商行业安全防御体系重构
在数字经济蓬勃发展的时代,运营商作为信息通信网络的核心枢纽,承载着海量用户数据与关键业务传输,其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级,传统安全防护体系逐渐暴露出局限性&a…...
