mysql系列1—mysql架构和协议介绍
背景:
本文开始整理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
测试使用,所有写入的数据都会丢失,只进不出,如同丢进了黑洞。
相关文章:
mysql系列1—mysql架构和协议介绍
背景: 本文开始整理mysql相关的文章,用于收集数据库相关内容;包括mysql架构和存储方式、索引结构和查询优化、数据库锁等内容。思考如何根据具体的业务给出最优的分表规划和表设计、字段选择和索引设计、优化的SQL语句,以及数据库…...
设计模式——模板模式
定义与基本概念 模板模式(Template Pattern)是一种行为设计模式。它在一个抽象类中定义了一个操作的算法骨架,将一些步骤的实现延迟到具体子类中。这个抽象类就像是一个模板,定义了执行某个流程的基本框架,而具体的细…...
CV22_语义分割基础
1. 常见的分割类型 在计算机视觉领域,根据不同的应用场景和需求,分割任务可以分为几种主要类型。以下是几种常见的分割类型: 语义分割(Semantic Segmentation): 语义分割的目标是将图像中的每个像素分配到…...
Dubbo源码解析-Dubbo的线程模型(九)
一、Dubbo线程模型 首先明确一个基本概念:IO 线程和业务线程的区别 IO 线程:配置在netty 连接点的用于处理网络数据的线程,主要处理编解码等直接与网络数据 打交道的事件。 业务线程:用于处理具体业务逻辑的线程,可以…...
【Canvas与标志】圆角三角形生化危险警示标志
【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>圆角三角形生化危险警示标志 Draft1</title><style type&qu…...
解决Dcat Admin laravel框架登录报错问题,(blocked:mixed-content)
前言 在使用 Dcat Admin 后台登录时,发生 error 报错:(blocked:mixed-content) xhr VM484:1,浏览器拦截 其实这是浏览器在 HTTPS 页面中尝试加载 HTTP 资源,导致浏览器阻止了这些不安全的请求。 解决 在 .env 文件中添加或修改 AD…...
(三)Sping Boot学习——升级jdk1.8-jdk18
1.修改系统环境变量。 2.idea中修改配置。 3.项目setting中设置修改 4.更新后还要重新下载依赖mvn clean install ,并且记住reload 项目。同时查看java -version查看一下jdk版本。...
语言模型中的多模态链式推理
神经网络的公式推导 简介摘要引言多模态思维链推理的挑战多模态CoT框架多模态CoT模型架构细节编码模块融合模块解码模块 实验结果运行代码补充细节安装包下载Flan-T5数据集准备rougenltkall-MiniLM-L6-v2运行 简介 本文主要对2023一篇论文《Multimodal Chain-of-Thought Reason…...
SCons:下一代构建工具,如何用 Python 驱动高效构建?
在现代软件开发中,构建工具是开发流程中不可或缺的一环。无论是小型项目还是跨平台的复杂工程,选择一个高效、灵活的工具都能显著提高开发效率和代码质量。SCons,一个以 Python 为基础的构建工具,通过自动化依赖管理、灵活的扩展性…...
springboot 整合 rabbitMQ (延迟队列)
前言: 延迟队列是一个内部有序的数据结构,其主要功能体现在其延时特性上。这种队列存储的元素都设定了特定的处理时间,意味着它们需要在规定的时间点或者延迟之后才能被取出并进行相应的处理。简而言之,延时队列被设计用于存放那…...
ES 基本使用与二次封装
概述 基本了解 Elasticsearch 是一个开源的分布式搜索和分析引擎,基于 Apache Lucene 构建。它提供了对海量数据的快速全文搜索、结构化搜索和分析功能,是目前流行的大数据处理工具之一。主要特点即高效搜索、分布式存储、拓展性强 核心功能 全文搜索:…...
分割一切2.0,SAM2详解
🏡作者主页:点击! 🤖编程探索专栏:点击! ⏰️创作时间:2024年11月24日20点03分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文链接 点击开启你的论文编程之旅…...
Spring AI Fluent API:与AI模型通信的流畅体验
引言 随着人工智能(AI)技术的飞速发展,越来越多的应用场景开始融入AI技术以提升用户体验和系统效率。在Java开发中,与AI模型通信成为了一个重要而常见的需求。为了满足这一需求,Spring AI引入了ChatClient,…...
基于python的长津湖评论数据分析与可视化,使用是svm情感分析建模
引言 研究背景及意义 上世纪初开始,中国电影就以自己独有的姿态登上了世界电影史的舞台。中国电影作为国家文化和思想观念的反映与延伸,能够增强文化自信,在文化输出方面有着极其重要的作用1[1]。 改革开放以来,随着生产力的提高…...
Lucene(2):Springboot整合全文检索引擎TermInSetQuery应用实例附源码
前言 本章代码已分享至Gitee: https://gitee.com/lengcz/springbootlucene01 接上文。Lucene(1):Springboot整合全文检索引擎Lucene常规入门附源码 如何在指定范围内查询。从lucene 7 开始,filter 被弃用,导致无法进行调节过滤。 TermInSetQuery 指定…...
shell完结
声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…...
【2024最新】基于Springboot+Vue的智慧食堂系统Lw+PPT
作者:计算机搬砖家 开发技术:SpringBoot、php、Python、小程序、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。 专栏推荐:SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:Java精选实战项…...
NVR小程序接入平台EasyNVR多品牌NVR管理工具:高效管理分散视频资源的解决方案
在当今数字化、智能化的时代背景下,视频监控已成为各行各业不可或缺的一部分,从公共安全到企业运维,再到智慧城市建设,视频资源的管理与应用正面临着前所未有的挑战。如何高效整合、管理这些遍布各地的分散视频资源,成…...
排序算法(三)--插入排序
文章目录 一、插入排序的基本原理二、插入排序的C语言实现三、代码解析 插入排序 C语言实例 一、插入排序的基本原理 插入排序的基本思想是将数组中的元素逐一取出,然后将其插入到已经排好序的部分中的适当位置,直到整个数组排序完成。具体步骤如下&…...
YOLOv11融合[ECCV 2018]RCAN中的RCAB模块及相关改进思路
YOLOv11v10v8使用教程: YOLOv11入门到入土使用教程 YOLOv11改进汇总贴:YOLOv11及自研模型更新汇总 《Image Super-Resolution Using Very Deep Residual Channel Attention Networks》 一、 模块介绍 论文链接:https://arxiv.org/abs/1807…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...
Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...
