【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.mzph.cn/news/661894.shtml

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

相关文章

go数据操作-elasticsearch

go-elasticsearch是Elasticsearch 官方提供的 Go 客户端。每个 Elasticsearch 版本会有一个对应的 go-elasticsearch 版本。 1.安装依赖 执行以下命令安装v8版本的 go 客户端。 go get github.com/elastic/go-elasticsearch/v8latest导入依赖。 import "github.com/el…

vue学习——elementPlus安装及国际化

引入完整的elementPlus 安装 pnpm i element-plus引入 // main.ts import { createApp } from vue import ElementPlus from element-plus import element-plus/dist/index.css import App from ./App.vueconst app createApp(App)app.use(ElementPlus) app.mount(#app)图标…

JAVA斗地主逻辑-控制台版

未排序版: 准备牌->洗牌 -> 发牌 -> 看牌: App程序入口: package doudihzu01;public class App {public static void main(String[] args) {/*作为斗地主程序入口这里不写代码逻辑*///无参创建对象,作为程序启动new PokerGame();…

大力说视频号第二课:视频号如何挂链接带货

最近,随着视频号带货的风潮,不少小伙伴已经成功跟上潮流,在这个平台上轻松赚取收入。 然而,仍有不少小伙伴对于如何在视频号中挂链接带货感到有些困惑。 目前,视频号的主流带货方式主要分为三种: 01 挂“…

(每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第9章 项目范围管理(四)

博主2023年11月通过了信息系统项目管理的考试,考试过程中发现考试的内容全部是教材中的内容,非常符合我学习的思路,因此博主想通过该平台把自己学习过程中的经验和教材博主认为重要的知识点分享给大家,希望更多的人能够通过考试&a…

回归预测 | Matlab实现CPO-LSTM【24年新算法】冠豪猪优化长短期记忆神经网络多变量回归预测

回归预测 | Matlab实现CPO-LSTM【24年新算法】冠豪猪优化长短期记忆神经网络多变量回归预测 目录 回归预测 | Matlab实现CPO-LSTM【24年新算法】冠豪猪优化长短期记忆神经网络多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CPO-LSTM【24年新算…

QT 范例阅读: undoframework

一、功能 通过给 QGraphicsScene 添加、删除、移动 QGraphicsPolygonItem 来演示 撤销重做功能 标签 undo framework example 二、核心代码,以添加图例为例 MainWindow.cpp 的核心代码 //1 创建堆栈 undoStack new QUndoStack(this); //2 以列表的形式显…

LeetCode第783题 - 二叉搜索树节点最小距离

题目 解答 方案一 class Solution {private List<Integer> values new ArrayList<>();public void inorder(TreeNode node) {if (node null) {return;}inorder(node.left);values.add(node.val);inorder(node.right);}public int minDiffInBST(TreeNode root)…

AI 代码生成

1 csdnC知道 https://so.csdn.net/chat?from_spm1008.2611.3001.9686 2 百度搜索AI伙伴 https://chat.baidu.com/ 3 阿里通义千问 https://tongyi.aliyun.com/qianwen/?spm5176.28326591.0.0.2a8a6ee1TUqfmH //还有的小伙伴们留言,我来整理 //感谢大家的点赞&#xff0c;…

工业自动化中与多台PLC通讯的基本指南

与多台PLC进行通讯是工业自动化中常见的需求。通常&#xff0c;一台THM&#xff08;通常是触摸屏或人机界面&#xff09;会与多台PLC进行通讯&#xff0c;以实现数据交互和控制功能。以下是一个基本的步骤指南&#xff0c;用于实现1台THM与多台PLC的通讯&#xff1a; 确定通讯…

在本机搭建私有NuGet服务器

写在前面 有时我们不想对外公开源码&#xff0c;同时又想在VisualStudio中通过Nuget包管理器来统一管理这些内部动态库&#xff0c;这时就可以在本地搭建一个NuGet服务器。 操作步骤 1.下载BaGet 这是一个轻量级的NuGet服务器 2.部署BaGet 将下载好的release版本BaGet解…

docker搭建nginx的RTMP服务器的步骤

使用Docker 另一个选项是使用Docker容器运行Nginx和RTMP模块。Docker Hub上有一些预构建的镜像&#xff0c;这些镜像已经集成了Nginx和RTMP模块&#xff0c;可以直接使用&#xff0c;无需手动编译。 例如&#xff0c;使用一个预构建的Nginx-RTMP Docker镜像&#xff1a; doc…

docker- php7.4

安装 gd拓展 anzhuanga在Dockerfile里面安装php7.4的GD库 - 知乎 apt update apt install -y libwebp-dev libjpeg-dev libpng-dev libfreetype6-devdocker-php-source extractdocker-php-ext-configure gd \ --with-jpeg/usr/include \ --with-freetype/usr/include/docker-…

Java Path详解

Java Path详解 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;我们将深入探讨Java中的Path&#xff0c;解析它的功能、用法以及在文件处理中的应用…

Linux系统管理和Shell脚本笔试题

1、写一个sed命令&#xff0c;修改/tmp/input.txt文件的内容&#xff0c;要求&#xff1a;(1) 删除所有空行&#xff1b;(2) 在非空行前面加一个"AAA"&#xff0c;在行尾加一个"BBB"&#xff0c;即将内容为11111的一行改为&#xff1a;AAA11111BBB #写入内…

Android 中的卡顿优化

常见的手机卡顿现象&#xff1a; 视频加载慢&#xff1b;画面卡顿、卡死、黑屏&#xff1b;声音卡顿、音画不同步&#xff1b;动画帧卡顿&#xff0c;交互响应慢&#xff1b;滑动不跟手&#xff1b;列表自动更、滚动不流畅&#xff1b;网络响应慢、数据和画面展示慢&#xff1…

【机器学习 深度学习】卷积神经网络简述

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;专栏&#xff1a;机器学习 欢迎订阅&#xff01;相对完整的机器学习基础教学&#xff01; ⭐特别提醒&#xff1a;针对机器学习&#xff0c;特别开始专栏&#xff1a;机器学习python实战…

算法:箱子之形摆放

一、算法描述及解析 要求将一批箱子按从上到下以‘之’字形的顺序摆放在宽度为 n 的空地上&#xff0c;输出箱子的摆放位置&#xff0c; 例如&#xff1a;箱子ABCDEFG&#xff0c;空地宽为3。 如输入&#xff1a; ABCDEFG 3 输出&#xff1a; AFG BE CD 注&#xff1a;最后一行…

uni-app 经验分享,从入门到离职(三)——关于 uni-app 生命周期快速了解上手

文章目录 &#x1f4cb;前言⏬关于专栏 &#x1f3af;什么是生命周期&#x1f9e9;应用生命周期&#x1f4cc; 关于 App.vue/App.uvue &#x1f9e9;页面生命周期&#x1f4cc;关于 onShow 与 onLoad 的区别 &#x1f4dd;最后 &#x1f4cb;前言 这篇文章是本专栏 uni-app 基…

轻松使用python照片太大,设置为宽21cm,300像素(成功)

在本篇博文中&#xff0c;我们将学习如何使用Python中的Pillow库来调整图片的尺寸&#xff0c;并且保持图片的长宽比例不变。这个功能在许多图像处理任务中非常有用&#xff0c;比如在网页设计、图像处理和打印等方面。 介绍 Python的Pillow库是一个功能强大的图像处理库&…