【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.rhkb.cn/news/249677.html

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

相关文章

【安装记录】Chrono Engine安装记录

本文仅用于个人安装记录。 官方安装教程 https://api.projectchrono.org/8.0.0/tutorial_install_chrono.html Windows下安装 windows下安装就按照教程好了。采用cmake-gui进行配置,建议首次安装只安装核心模块。然后依此configure下irrlicht,sensor…

J-Link:STM32使用J-LINK烧录程序,其他MCU也通用

说明:本文记录使用J-LINK烧录STM32程序的过程。 1. J-LINK驱动、软件下载 1、首先拥有硬件J-Link烧录器。 2、安装J-Link驱动程序SEGGER 下载地址如下 https://www.segger.com 直接下载就可以了。 2.如何使用J-LINK向STM32烧写程序 1、安装好以后打开J-LINK Fl…

从零开始:CentOS系统下搭建DNS服务器的详细教程

前言 如果你希望在CentOS系统上建立自己的DNS服务器,那么这篇文章绝对是你不容错过的宝藏指南。我们提供了详尽的步骤和实用技巧,让你能够轻松完成搭建过程。从安装必要的软件到配置区域文件,我们都将一一为你呈现。无论你的身份是运维人员,还是程序员,抑或是对网络基础设…

【脑电信号处理与特征提取】P7-涂毅恒:运用机器学习技术和脑电进行大脑解码

运用机器学习技术和脑电进行大脑解码 科学研究中的大脑解码 比如2019年在Nature上一篇文章,来自UCSF的Chang院士的课题组,利用大脑活动解码语言,帮助一些患者恢复语言功能。 大脑解码的重要步骤 大脑解码最重要的两步就是信号采集和信号…

Coremail启动鸿蒙原生应用开发,打造全场景邮件办公新体验

1月18日,华为在深圳举行鸿蒙生态千帆启航仪式,Coremail出席仪式并与华为签署鸿蒙合作协议,宣布正式启动鸿蒙原生应用开发。作为首批拥抱鸿蒙的邮件领域伙伴,Coremail的加入标志着鸿蒙生态版图进一步完善。 Coremail是国内自建邮件…

浏览器——HTTP缓存机制与webpack打包优化

文章目录 概要强缓存定义开启 关闭强缓存协商缓存工作机制通过Last-Modified If-Modified-Since通过ETag If-None-Match 不使用缓存前端利用缓存机制,修改打包方案webpack 打包webpack 打包名称优化webpack 默认的hash 值webapck其他hash 类型配置webpack打包 web…

数据结构-内部排序

简介 排序(Sorting):将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列 排序算法分为内部排序和外部排序 内部排序:在排序期间数据对象全部存放在内存的排序 外部排序&am…

MySQL-运维-主从复制

一、概述 二、原理 三、搭建 1、服务器准备 2、主库配置 (1)、修改配置文件/etc/my.cnf (2)、重启MySQL服务器 (3)、登录mysql,创建远程链接的账号,并授予主从复制权限 &#xff0…

3593 蓝桥杯 查找最大元素 简单

3593 蓝桥杯 查找最大元素 简单 // C风格解法1&#xff0c;通过率100%&#xff0c;多组数据处理样式//str "abcdefgfedcba" //abcdefg(max)fedcba//str "xxxxx" //x(max)x(max)x(max)x(max)x(max)#include<bits/stdc.h>const int N 1e2 10;char …

分类预测 | Matlab实现SCN-Adaboost随机配置网络模型SCN的Adaboost数据分类预测/故障识别

分类预测 | Matlab实现SCN-Adaboost随机配置网络模型SCN的Adaboost数据分类预测/故障识别 目录 分类预测 | Matlab实现SCN-Adaboost随机配置网络模型SCN的Adaboost数据分类预测/故障识别分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现SCN-Adaboost随机配置网…

vue——实现多行粘贴到table事件——技能提升

最近在写后台管理系统时&#xff0c;遇到一个需求&#xff0c;就是要从excel表格中复制多行内容&#xff0c;然后粘贴到后台系统中的table表格中。 如下图所示&#xff1a;一次性复制三行内容&#xff0c;光标放在红框中的第一个框中&#xff0c;然后按ctrlv粘贴事件&#xff0…

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

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

WordPress如何使用SQL实现一键关闭/开启评论功能(已有评论)

WordPress本人就自带评论功能&#xff0c;不过由于种种原因&#xff0c;有些站长不想开启评论功能&#xff0c;那么应该怎么实现一键关闭评论功能或开启评论功能呢&#xff1f;或者针对已有评论功能的文章进行一键关闭或开启评论功能应该怎么操作&#xff1f; 如果你使用的Wor…

Walrus 0.5发布:重构交互流程,打造开箱即用的部署体验

开源应用管理平台 Walrus 0.5 已于近日正式发布&#xff01; Walrus 0.4 引入了全新应用模型&#xff0c;极大程度减少了重复的配置工作&#xff0c;并为研发团队屏蔽了云原生及基础设施的复杂度。Walrus 0.5 在这一基础上&#xff0c;通过重构交互流程、增强抽象能力&#xff…

【tensorflow 版本 keras版本】

#. 安装tensorflow and keras&#xff0c; 总是遇到版本无法匹配的问题。 安装之前先查表 https://master--floydhub-docs.netlify.app/guides/environments/ 1.先确定你的python version 2.再根据下面表&#xff0c;确定安装的tesorflow, keras

废品上门回收小程序搭建全过程

随着人们对环境保护意识的不断增强&#xff0c;废品回收成为了一项重要的社会活动。为了方便废品回收的顾客和回收者之间的联系&#xff0c;废品上门回收小程序成为了一种流行的解决方案。然而&#xff0c;如何选择一款合适的废品上门回收小程序搭建平台呢&#xff1f;下面将为…

缓存相关问题记录解决

缓存相关问题 在这里我不得不说明,我写的博客都是我自己用心写的,我自己用心记录的,我写的很详细,所以会有点冗长,所以如果你能看的下去的化,会有所收获,我不想写那种copy的文章,因为对我来说没什么益处,我写的这篇博客,就是为了记录我缓存的相关问题,还有我自己的感悟,所以如果…

elementUI实现selecttree自定义下拉框树形组件支持多选和搜索

elementUI实现selecttree自定义下拉框树形组件支持多选和搜索 效果图定义子组件父组件应用 效果图 定义子组件 主要结合el-select和el-tree两个组件改造的。 <template><div class"selectTree"><el-select filterable :filter-method"filterMe…

有趣的css - 动态的毛玻璃背景

页面效果 此效果主要使用 backdrop-filter 属性&#xff0c;以及配合 animation 属性来实现毛玻璃模糊和一些动效。 此效果可适用于登录窗口&#xff0c;网站背景或者一些卡片列表中&#xff0c;使网页更具科技感和空间感。 核心代码部分&#xff0c;简要说明了写法思路&#x…

RK3588开发板Ubuntu与开发板使用U盘互传

1 将 U 盘(U 盘的格式必须为 FAT32 格式&#xff0c;大小在 32G 以下)插到开发板的 usb 接口&#xff0c;串口打印信息如下所示&#xff0c;U 盘的设备节点是/dev/sdb4。U 盘的设备节点不是固定的&#xff0c;根据实际情况来查看设备节点。 2 输入以下命令挂载 U 盘&#xff0c…