【Mysql】数据库架构学习合集

目录

  • 1. Mysql整体架构
    • 1-1. 连接层
    • 1-2. 服务层
    • 1-3. 存储引擎层
    • 1-4. 文件系统层
  • 2. 一条sql语句的执行过程
    • 2-1. 数据库连接池的作用
    • 2-2. 查询sql的执行过程
    • 2-1. 写sql的执行过程

1. Mysql整体架构

客户端: 由各种语言编写的程序,负责与Mysql服务端进行网络连接。

服务端: 包括以下几层

  1. 连接层:负责客户端的接入工作。
  2. 服务层:4大组件。SQL接口组件、解析器、优化器、缓存和缓冲区
  3. 存储引擎层:存储引擎负责与磁盘打交道。Mysql的存储引擎支持可拔插式,可以切换不同的存储引擎。
  4. 文件系统层:是一个基于磁盘的文件系统

一条sql语句的执行就是从上往下经过这4层。

在这里插入图片描述

1-1. 连接层

  1. 一个客户端的与服务端要建立连接,Mysql内部就需要一个线程来负责该客户端接下来的所有工作。
  2. MySQL是基于TCP/IP协议栈实现的连接建立工作,但并非使用HTTP协议建立连接的。具体协议要根据不同的客户端,例如:jdbc odbc
  3. 数据库连接池负责复用线程管理线程以及限制最大连接数。因为线程属于宝贵资源。
  4. show variables like '%max_connections%'; 查询目前Mysql的最大连接数。

1-2. 服务层

  • SQL接口组件

    1. 负责接收SQL语句,将其发送给其他组件。然后等待接收执行结果的返回,最后会将其返回给客户端。
  • 解析器

    1. 接收SQL接口组件发来的SQL语句
    2. 验证SQL语句是否正确,以及将SQL语句解析成MySQL能看懂的机器码指令
  • 优化器

    1. 解析器完成之后,优化器就生成执行计划,最终会选择出一套最优的执行计划。这个执行的过程实际上是在调用存储引擎所提供的API。
  • 缓存和缓冲区

    1. 缓存主要就是select的数据缓存。MySQL会对于一些经常执行的查询SQL语句,将其结果保存在缓存中。
    2. MySQL 8.X中,移除了缓存区,毕竟命中率不高。同时一般程序都会使用Redis做一次缓存。
    3. 缓冲区的设计主要是:为了通过内存的速度来弥补磁盘速度较慢对数据库造成的性能影响。
    4. 对数据库进行写操作时,都会先从缓冲区中查询是否有,如果有,则直接对内存中的数据进行操作(例如修改、删除等),对缓冲区中的数据操作完成后,会直接给客户端返回成功的信息,然后MySQL会在后台利用一种名为Checkpoint的机制,将内存中更新的数据刷写到磁盘。
    5. 缓冲区是与存储引擎有关的,不同的存储引擎实现也不同,比如InnoDB的缓冲区叫做innodb_buffer_pool,而MyISAM则叫做key_buffer

1-3. 存储引擎层

  1. 存储引擎是MySQL数据库中与磁盘文件打交道的子系统,不同的引擎底层访问文件的机制也存在些许细微差异。
  2. 引擎也不仅仅只负责数据的管理,也会负责库表管理索引管理等,MySQL中所有与磁盘打交道的工作,最终都会交给存储引擎来完成。

1-4. 文件系统层

  1. 本质上就是基于机器物理磁盘的一个文件系统,其中包含了配置文件、库表结构文件、数据文件、索引文件、日志文件等各类MySQL运行时所需的文件。
  2. 这一层的功能比较简单,也就是与上层的存储引擎做交互,负责数据的最终存储与持久化工作。
  3. 这一层主要可分为两个板块:①日志板块②数据板块

日志板块

①binlog二进制日志,主要记录MySQL数据库的所有写操作(增删改)。

②redo-log重做/重写日志,MySQL崩溃时,对于未落盘的操作会记录在这里面,用于重启时重新落盘(InnoDB专有的)。

③undo-logs撤销/回滚日志,记录事务开始前[修改数据]的备份,用于回滚事务。

④error-log:错误日志:记录MySQL启动、运行、停止时的错误信息。

⑤general-log常规日志,主要记录MySQL收到的每一个查询或SQL命令。

⑥slow-log:慢查询日志,主要记录执行时间较长的SQL。

⑦relay-log:中继日志,主要用于主从复制做数据拷贝。


数据板块

db.opt文件:主要记录当前数据库使用的字符集和验证规则等信息。

.frm文件:存储表结构的元数据信息文件,每张表都会有一个这样的文件。

.MYD文件:用于存储表中所有数据的文件(MyISAM引擎独有的)。

.MYI文件:用于存储表中索引信息的文件(MyISAM引擎独有的)。

.ibd文件:用于存储表数据和索引信息的文件(InnoDB引擎独有的)。

.ibdata文件:用于存储共享表空间的数据和索引的文件(InnoDB引擎独有)。

.ibdata1文件:这个主要是用于存储MySQL系统(自带)表数据及结构的文件。

.ib_logfile0/.ib_logfile1文件:用于故障数据恢复时的日志文件。

.cnf/.ini文件:MySQL的配置文件,Windows下是.ini,其他系统大多为.cnf。

2. 一条sql语句的执行过程

2-1. 数据库连接池的作用

客户端要将SQL语句发给服务端之前,要先根据配置文件中的urlusernamepassword与服务端进行网络连接

由于涉及到了网络请求,那此时必然会先经历TCP三次握手的过程,同时获取到连接对象完成SQL操作后,又要释放这个数据库连接,此时又需要经历TCP四次挥手过程。

因此每次操作数据库时,客户端都需要获取新的连接对象,这是非常耗时耗资源的操作。

数据库连接池」和「线程池」的思想相同,会将数据库连接这种较为珍贵的资源,利用池化技术对这种资源进行维护。也就代表着之后需要进行数据库操作时,不需要自己去建立连接了,而是直接从「数据库连接池」中获取,用完之后再归还给连接池,以此达到复用的效果。

MySQL连接池维护的是工作线程,客户端连接池则维护的是网络连接。

2-2. 查询sql的执行过程

在这里插入图片描述
注意: Mysql 8.X 版本 已经移除了查询缓存

  • ①先将SQL发送给SQL接口,SQL接口会对SQL语句进行哈希处理。

  • ②SQL接口在缓存中根据哈希值检索数据,如果缓存中有则直接返回数据。

  • ③缓存中未命中时会将SQL交给解析器,解析器会判断SQL语句是否正确:

    • 错误:抛出1064错误码及相关的语法错误信息。
    • 正确:将SQL语句交给优化器处理,进入第④步。
  • ④优化器根据SQL制定出不同的执行方案,并择选出最优的执行计划。

  • ⑤工作线程根据执行计划,调用存储引擎所提供的API获取数据。

  • ⑥存储引擎根据API调用方的操作,去磁盘中检索数据(索引、表数据…)。

  • ⑦发生磁盘IO后,对于磁盘中符合要求的数据逐条返回给SQL接口。

  • ⑧SQL接口会对所有的结果集进行处理(剔除列、合并数据…)并返回。

2-1. 写sql的执行过程

在这里插入图片描述

  • ①先将SQL发送给SQL接口,SQL接口会对SQL语句进行哈希处理。
  • ②在缓存中根据哈希值检索数据,如果缓存中有,则将对应表的所有缓存全部删除
  • ③经过缓存后会将SQL交给解析器,解析器会判断SQL语句是否正确:
    • 错误:抛出1064错误码及相关的语法错误信息。
    • 正确:将SQL语句交给优化器处理,进入第④步。
  • ④优化器根据SQL制定出不同的执行方案,并择选出最优的执行计划。
  • ⑤在执行开始之前,先记录一下undo-log日志和redo-log(prepare状态)日志。
  • 在缓冲区中查找是否存在当前要操作的行记录或表数据(内存中):
    • 存在:
      • ⑦直接对缓冲区中的数据进行写操作。
      • ⑧然后利用Checkpoint机制刷写到磁盘。
    • 不存在:
      • ⑦根据执行计划,调用存储引擎的API。
      • ⑧发生磁盘IO,对磁盘中的数据做写操作。
  • ⑨写操作完成后,记录bin-log日志,同时将redo-log日志中的记录改为commit状态。
  • ⑩将SQL执行耗时及操作成功的结果返回给SQL接口,再由SQL接口返回给客户端。

undo-log日志

  • 撤销/回滚日志,所有的写SQL在执行之前都会生成对应的撤销SQL,撤销SQL也就是相反的操作
  • 比如现在执行的是insert语句,那这里就生成对应的delete语句

undo-log日志

  • InnoDB引擎专属的,将写SQL的事务过程记录在案,如果服务器或者MySQL宕机,重启时就可以通过redo_log日志恢复更新的数据。
  • 在「写SQL」正式执行之前,就会先记录一条prepare状态的日志,表示当前「写SQL」准备执行,然后当执行完成并且事务提交后,这条日志记录的状态才会更改为commit状态。

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

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

相关文章

MySQL系列:系列结构和基础管理

文章目录 MySQL工作模型及实例MySQL 客户端/服务器工作模型(C/S)服务端:实例MySQLd的程序结构MySQL的逻辑结构MySQL的物理存储结构 MySQL基础管理用户管理权限管理连接管理初始化配置启动关闭多实例 MySQL工作模型及实例 MySQL 客户端/服务器…

Python之代码覆盖率框架coverage使用介绍

Python代码覆盖率工具coverage.py其实是一个第三方的包,同时支持Python2和Python3版本。 安装也非常简单,直接运行: pip install coverage 安装完成后,会在Python环境下的\Scripts下看到coverage.exe; 首先我们编写…

测试access和trunk口的区别(华为)

思科设备参考:测试access和trunk口的区别(思科) 一,实验目的 实现同一 Vlan 内的主机互通,不同 Vlan 间的主机隔离。 二,配置前测试 PC1分别ping PC2、PC3、PC4都能通,因为四台PC默认同处于v…

【CSS】css选择器和css获取第n个元素(:nth-of-type(n)、:nth-child(n)、first-child和last-child)

:nth-of-type、:nth-child的区别 一、css选择器二、:nth-of-type、:nth-child的区别:nth-of-type(n):选择器匹配属于父元素的特定类型的第N个子元素:nth-child(n):选择器匹配属于其父元素的第 N 个子元素,不论元素的类型:first-child&#xf…

【蓝桥杯冲冲冲】动态规划学习 [NOIP2003 提高组] 加分二叉树

【蓝桥杯冲冲冲】动态规划学习 [NOIP2003 提高组] 加分二叉树 蓝桥杯备赛 | 洛谷做题打卡day24 文章目录 蓝桥杯备赛 | 洛谷做题打卡day24[NOIP2003 提高组] 加分二叉树题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示数据规模与约定思路 题解代码我的一些话 [NOI…

如何使用内网穿透工具在公网实现实时监测DashDot服务器仪表盘

文章目录 1. 本地环境检查1.1 安装docker1.2 下载Dashdot镜像 2. 部署DashDot应用3. 本地访问DashDot服务4. 安装cpolar内网穿透5. 固定DashDot公网地址 本篇文章我们将使用Docker在本地部署DashDot服务器仪表盘,并且结合cpolar内网穿透工具可以实现公网实时监测服务…

idea docker 镜像生成太慢太大问题

文章目录 前言一、更小的jdk基础镜像二、服务瘦包(thin jar)2.1 maven2.2 修改dockerfile2.3 container run options 三、 基础jdk镜像入手?总结 前言 idea docker 内网应用实践遗留问题 idea docker插件 build 服务镜像太慢服务镜像太大 …

【蓝桥杯51单片机入门记录】LED

目录 一、基础 (1)新建工程 (2)编写前准备 二、LED (1)点亮LED灯 (2)LED闪烁 延时函数的生成(stc-isp中生成) 实现 (3)流水灯…

flutter GridView控件实践

gridView顶部自带padding问题 如图所示: 顶部有一个比较大的padding。 如何处理:给gridView设置:padding: EdgeInsets.zero,

C#,桌面游戏编程,数独游戏(Sudoku Game)的算法与源代码

本文包括以下内容: (1)数独游戏的核心算法; (2)数独游戏核心算法的源代码; (3)数独游戏的部分题目样本; (4)适老版《数独》的设计原则…

JAVA操作Rabbitmq-原理讲的很详细

这篇文章来源于稀土掘金,来源:https://juejin.cn/post/7132268340541653005,主要用来收藏学习。 常见的消息队列很多,主要包括 RabbitMQ、Kafka、RocketMQ 和 ActiveMQ,相关的选型可以看我之前的系列,这篇文…

用Python处理TDC激光测距数据并绘制为图片

用Python处理TDC激光测距数据并绘制为图片 说明一、定义全局变量变二、主函数入口三、处理原始文件数据四、将数据叠加统计生成图片五、额外的辅助函数六、将数据进行各种形式统计叠加七、原始数据形式八、 测试结果 说明 1. 主要是将TDC激光测距数据进行统计叠加并绘制为图片…

09. 配置Eth-Trunk

文章目录 一. 初识Eth-Trunk1.1. Eth-Trunk的概述1.2. Eth-Trunk的优势1.3. Eth-Trunk的模式的优势 二. 实验专题2.1. 实验1:手工模式2.1.1. 实验拓扑图2.1.2. 实验步骤(1)配置PC机的IP地址(2)在交换机接口划入VLAN&am…

Ubuntu远程连接登录信息解读(ubuntu登录信息、远程登录信息)

文章目录 1. Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 5.4.0-100-generic aarch64)2. 三个链接是官方提供的文档、管理工具和技术支持3. System information as of Thu 01 Feb 2024 03:30:45 PM HKT4. System load: 1.16:系统负载指数5. Processes: 1096系统正在运…

防火墙 双机热备直路部署--上下三层配置

双机热备直路部署 -- 上下三层 双机热备直路部署的特点是防火墙接口都是三层工作模式,相当于防火墙在进行路由部 署。 1. 根据网段划分配置IP地址和安全区域 AR1配置: [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 1.1.1.2 24 [Huawei-GigabitEthernet…

Codeforces Round 893 (Div. 2)补题

Buttons(Problem - A - Codeforces) 题目大意:有三排按钮数量分别为a,b,c,第一排只能由A按下,第二排只能由B按下,第三排可以被任意一个人按下,问两人轮流游戏,谁没有可以按的谁输,问如果都发挥…

易语言系列学习1

通过本文章你会学习到 如果 如果真 获取编辑框内容 关闭本程序 监听按键让它等价于点击某个按钮 运算:或 且 非(注意中间要有一个空格,否则会报错) 效果 .版本 2.程序集 窗口程序集_启动窗口.子程序 _按钮2_被单击. 如果真 (编…

C#,斯特林数(Stirling Number)的算法与源代码

1 斯特林数 在组合数学,斯特林数可指两类数,第一类斯特林数和第二类斯特林数,都是由18世纪数学家James Stirling提出的。它们自18世纪以来一直吸引许多数学家的兴趣,如欧拉、柯西、西尔沃斯特和凯莱等。后来哥本哈根(…

使用 postcss-cva 来生成 cva 方法吧

使用 postcss-cva 来生成 cva 方法吧 使用 postcss-cva 来生成 cva 方法吧 什么是 cva 封装示例组成参数 postcss-cva 的功能 Css 示例原子化设计注释参考生成cva函数 Refers 什么是 cva cva 全称为 class-variance-authority, 它是一个非常适合制作那种,创建控…

Ps:自动混合图层

Ps菜单:编辑/自动混合图层 Edit/Auto-Blend Layers 自动混合图层 Auto-Blend Layers命令可以自动地混合多个图层,特别适合于制作全景图、焦点堆叠、曝光合成或任何需要平滑融合多个图像的场景。 自动混合图层命令仅适用于 RGB 或灰度图像,不适…
最新文章