mysql系列1—mysql架构和协议介绍

news2024/11/25 14:38:23

背景:

本文开始整理mysql相关的文章,用于收集数据库相关内容;包括mysql架构和存储方式、索引结构和查询优化、数据库锁等内容。思考如何根据具体的业务给出最优的分表规划和表设计、字段选择和索引设计、优化的SQL语句,以及数据库参数优化。
本文作为mysql系列的第一篇,先从整体上理解一下mysql的组成结构以及查询流程,然后对存储引擎进行简要介绍,作为后续文章的基础。

1.mysql架构

mysql整体上可分为客户端与服务器端,客户端包括客户端连接工具以及连接驱动(如:JAVA的JDBC);
服务端指提供数据库能力的Mysql服务器,架构如下图所示:
请添加图片描述
上图来自mysql官网,较为清晰、分层次地展示了mysql的架构和每层的组成组件。

1.1 连接层

mysql启动时,连接层负责启动监听端口(默认为3306),接受处理TCP客户端的连接、并完成鉴权和建链操作。连接建立后,连接层为客户端会话分配资源、管理会话的生命周期(会话的创建、维护、销毁)。
连接期间,将客户端的消息转发到服务层,以及将查询结果返回给客户端,完成mysql客户端与服务端间的通讯。通讯使用mysql协议进行,支持配置明文或加密通讯。这部分内容较多,在第2章中详细介绍。

1.2 服务层

服务层由SQL解析器、优化器和执行引擎和查询缓存等组件组成。
(1) 查询缓存
查询缓存中存放SQL语句及其对应的结果集,遇到相同查询时,根据缓存返回结果,避免重复查询数据库。因效率和性能问题,在mysql8中已废弃,本文后续直接忽略服务层的查询缓存。
(2) 解析器和优化器
解析器与编译器逻辑相同,目标是SQL语句。对SQL进行语法解析和语义解析并生成解析树,解析失败时会返回错误信息。优化器对解析树基于统计信息和索引信息等进行优化,从多条执行路径中选择最优的一条发送给执行引擎。
(3) 执行引擎
根据优化器生成的执行路径,调用存储引擎接口,完成数据库操作。

1.3 存储层

存储层由存储引擎和文件系统组成。mysql数据库表和数据以文件形式存放于磁盘中。文件系统包括:表、索引、数据文件、undo/redo/binlog日志文件等。存储引擎可以理解为读取文件的软件驱动。mysql的存储层被设计为插件机制,用于支持不同的存储引擎,如InnoDB, CSV,Memeory等;存储引擎将在第4章中详细说明。

1.4 查询过程

了解连接层、服务层、存储层后,很清晰地得到以下查询流程:
![外链图片转存失败,源站可能有防盗链机制,建议将图请添加图片描述
【1】客户端与连接器建立mysql链接,并读取客户端的SQL语句;
【2】SQL语句经过解析器、预处理器、优化器的解析和优化生成执行路径;
【3】执行引擎根据执行路径的指令,调用存储引擎接口;
【4】存储引擎从文件系统读取对应的信息返回。

2.mysql协议消息

本章节结合抓包介绍mysql协议的消息流程图。
Before Content 1:
Linux机器上的mysql客户端一般使用SSL加密通讯,抓包不可读,可通过以下两种方式强制使用明文传输。
(1)连接命令添加"–ssl-mode=DISABLED"参数
如下所示:

mysql -u root -p{Password} --ssl-mode=DISABLED

(2)修改mysql.cnf配置文件
linux上mysql的配置文件路径一般为:/etc/my.cnf, 添加客户端配置:

[client]
ssl-mode = DISABLED

Before Content 2:
执行sql语句:

#1.连接mysql
mysql -uroot -p{Password} --ssl-mode=DISABLED

# 2.执行查询SQL
mysql> SELECT COUNT(1) FROM test.test_mysql;

# 输入quit断链
mysql> quit;

抓包命令:

tcpdump -i any port 3306 -w ./test_mysql.cap

得到的数据包如下所示:
请添加图片描述

消息流程图

客户端与mysql之间使用自定义的mysql协议通讯,具体的消息流程如下图所示:
请添加图片描述
可以分为四个阶段:

[1] 通过3次TCP握手,建立TCP链接

[2] mysql会话建立过程, 对应消息N1-N3

N1:服务器向客户端发送"Server Greeting"消息,携带服务器的版本和能力集等信息
请添加图片描述
N2:客户端向服务器发送"Login Request"消息,携带认证信息;
请添加图片描述
N3:服务器鉴权成功后,返回"Response OK"消息.
请添加图片描述

[3] 执行SQL阶段,对应消息N4-N5

N4执行查询"SELECT COUNT(1) FROM test.test_mysql;",对应消息如下所示:
请添加图片描述
N5是服务器返回的查询结果:
请添加图片描述

[4] 断链阶段,对应消息N6

请添加图片描述
客户端向服务器发送"Request Quit"消息断链mysql链路; 之后断开TCP链接。

3.存储引擎介绍

理解存储引擎,需要建立在数据存储形式以及底层IO的基础上(在后续文章中介绍)。本章仅从特性的角度进行简要说明。

如前文介绍,mysql在数据存储层通过插件机制实现,从而支持多种存储引擎,可以在定义表结构时指定使用的存储引擎。常见的存储引擎包括MyIsam、InnoDB、MEMORY、Archive、CSV、Blackhole,其中InnoDB是Mysql8默认的存储引擎。一般而言,MyIsam和InnoDB已满足大部分的业务场景,其他存储引擎作简单了解即可。

3.1 MyIsam

(1) 事务
不支持事务:每条SQL语句都会被直接提交、无法回滚;
(2) 数据库锁
支持表锁、不支持MVCC和行锁:当读写或者写写冲突时,整张表会被锁住,不适应并发较大的场景;
(3) 支持外键
不支持外键;
(4) 存储方式
表结构存储在.frm文件;记录数据存储在.myd文件中,而索引存放在.myi文件中。

3.2 InnoD

(1) 事务
支持事务;
(2) 数据库锁
支持行锁和MVCC, 适用于并发较大的场景;
(3) 支持外键
支持外键,允许在不同表之间建立外键关系,确保数据的完整性和一致性;
(4) 存储方式
表结构存储在.frm文件;记录数据和索引存储在.ibd文件中。

3.3 其他存储引擎

(1) MEMORY
数据保存在内存中,查询和更新速度较快。因不支持持久化,重启数据库会丢失所有记录;
(2) Archive
用于归档数据,仅支持插入和查询,不支持删除和修改;
(3) CSV
记录以csv文件形式保存;
(4) Blackhole
测试使用,所有写入的数据都会丢失,只进不出,如同丢进了黑洞。

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

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

相关文章

Opencv+ROS实现摄像头读取处理画面信息

一、工具 ubuntu18.04 ROSopencv2 编译器:Visual Studio Code 二、原理 图像信息 ROS数据形式:sensor_msgs::Image OpenCV数据形式:cv:Mat 通过cv_bridge()函数进行ROS向opencv转换 cv_bridge是在ROS图像消息和OpenCV图像之间进行转…

docker容器化部署springboot项目

前言 docker安装 下载官网 选择自己的系统 然后安装文档内给的命令按顺序执行即可。设置仓库,安装docker. 一、更换镜像源 一般情况下,docker原本自带的镜像网站不一定连的上,就很容易导致下载镜像失败,因此需要换源. 创建/etc/docker/daemon.json并填入数据…

实时数据开发|简单理解Flink流计算中解决乱序的机制--水位线

今天继续学习Flink的关键机制–水位线,虽然看文字有种浮于表面、难以理解的感觉,但是我觉得等开发中使用到的时候就会融会贯通了。 定义 Fink 相比其他流计算技术的一个重要特性是支持基于事件时间(event time)的窗口操作。但是事件时间来自于源头系统…

Edify 3D: Scalable High-Quality 3D Asset Generation 论文解读

目录 一、概述 二、相关工作 1、三维资产生成 2、多视图下的三维重建 3、纹理和材质生成 三、Edify 3D 1、文本生成多视角图像的扩散模型 2、文本和多视角图像生成法线图像的ControlNet 3、重建与渲染模型 4、多视角高分辨率RGB图像生成 四、训练 1、训练过程 2、…

2025-2026财年美国CISA国际战略规划(下)

文章目录 前言四、加强综合网络防御(一)与合作伙伴共同实施网络防御,降低集体风险推动措施有效性衡量 (二)大规模推动标准和安全,以提高网络安全推动措施有效性衡量 (三)提高主要合作…

uniapp实现开发遇到过的问题(持续更新中....)

1. 在ios模拟器上会出现底部留白的情况 解决方案: 在manifest.json文件,找到开源码视图配置,添加如下: "app-plus" : {"safearea":{"bottom":{"offset" : "none" // 底部安…

文小言1:

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

Oracle 23ai 对应windows版本安装配置PLSQL导入pde文件navicat连接Oracle

因为有一个pde文件需要查看里面的数据,所以这次需要配置本地oracle数据库,并且导入数据,因为还有navicat,所以就想用navicat去连接查看。 1、找到官网。 Get Started with Oracle Database 23ai | Oracle 2、下载windows版本。…

【热门主题】000062 云原生后端:开启高效开发新时代

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【热…

Python 版本的 2024详细代码

2048游戏的Python实现 概述: 2048是一款流行的单人益智游戏,玩家通过滑动数字瓷砖来合并相同的数字,目标是合成2048这个数字。本文将介绍如何使用Python和Pygame库实现2048游戏的基本功能,包括游戏逻辑、界面绘制和用户交互。 主…

spf算法、三类LSA、区间防环路机制/规则、虚连接

1.构建spf树: 路由器将自己作为最短路经树的树根根据Router-LSA和Network-LSA中的拓扑信息,依次将Cost值最小的路由器添加到SPF树中。路由器以Router ID或者DR标识。广播网络中DR和其所连接路由器的Cost值为0。SPF树中只有单向的最短路径,保证了OSPF区域内路由计管不…

(二)手势识别——动作模型训练【代码+数据集+python环境(免安装)+GUI系统】

(二)手势识别——动作模型训练【代码数据集python环境(免安装)GUI系统】 背景意义 随着互联网的普及和机器学习技术的进一步发展,手势识别技术开始使用深度学习等方法进行手势识别,如Convolutional Neural…

React的基本知识:事件监听器、Props和State的区分、改变state的方法、使用回调函数改变state、使用三元运算符改变state

这篇教学文章涵盖了大量的React基本知识。 包括: 事件监听器Props和State的区分改变state的方法使用回调函数改变state使用三元运算符改变state处理state中的数组处理state中的object条件渲染 &&条件渲染 三元运算符React中的forms 1. Event Listeners 在…

JavaScript练习——文本与图形

要求实现下面这个效果&#xff1a; 观察图片&#xff0c;我们的需求如下&#xff1a; 准备画布和上下文&#xff1a;在开始绘制之前&#xff0c;需要有一个HTML5 <canvas> 元素&#xff0c;并且获取其绘图上下文&#xff08;context&#xff09;&#xff0c;这是进行绘图…

【线程】线程安全问题及解决措施

【线程】线程安全问题及解决措施 前言一、由“随机调度”引起的线程安全问题1.1现象1.2 原因1.3 解决办法1.4 不当加锁造成的死锁问题 二、由“系统优化”引起的线程安全问题2.1 内存可见性问题 / 指令重排序问题2.2 解决方案 前言 何为线程安全&#xff0c;即某段代码无论在单…

[开源]3K+ star!微软Office的平替工具,跨平台,超赞!

大家好&#xff0c;我是JavaCodexPro&#xff01; 数字化的当下&#xff0c;高效的办公工具是提升工作效率的关键&#xff0c;然而大家想到的一定是 Microsoft Office 办公软件&#xff0c;然而价格也是相当具有贵的性价比。 今天JavaCodexPro给大家分享一款超棒的开源办公套…

【大数据分析机器学习】分布式机器学习

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈智能大数据分析 ⌋ ⌋ ⌋ 智能大数据分析是指利用先进的技术和算法对大规模数据进行深入分析和挖掘&#xff0c;以提取有价值的信息和洞察。它结合了大数据技术、人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&a…

SOL链上的 Meme 生态发展:从文化到创新的融合#dapp开发#

一、引言 随着区块链技术的不断发展&#xff0c;Meme 文化在去中心化领域逐渐崭露头角。从 Dogecoin 到 Shiba Inu&#xff0c;再到更多细分的 Meme 项目&#xff0c;这类基于网络文化的加密货币因其幽默和社区驱动力吸引了广泛关注。作为近年来备受瞩目的区块链平台之一&…

一篇保姆式centos/ubuntu安装docker

前言&#xff1a; 本章节分别演示centos虚拟机&#xff0c;ubuntu虚拟机进行安装docker。 上一篇介绍&#xff1a;docker一键部署springboot项目 一&#xff1a;centos 1.卸载旧版本 yum remove docker docker-client docker-client-latest docker-common docker-latest doc…

Dubbo源码解析-Dubbo的线程模型(九)

一、Dubbo线程模型 首先明确一个基本概念&#xff1a;IO 线程和业务线程的区别 IO 线程&#xff1a;配置在netty 连接点的用于处理网络数据的线程&#xff0c;主要处理编解码等直接与网络数据 打交道的事件。 业务线程&#xff1a;用于处理具体业务逻辑的线程&#xff0c;可以…