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

news2024/11/26 14:26:39

目录

  • 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.coloradmin.cn/o/1426170.html

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

相关文章

[C#][opencvsharp]opencvsharp sift和surf特征点匹配

SIFT特征和SURF特征比较 SIFT特征基本介绍 SIFT(Scale-Invariant Feature Transform)特征检测关键特征: 建立尺度空间,寻找极值关键点定位(寻找关键点准确位置与删除弱边缘)关键点方向指定关键点描述子 建立尺度空间&#xff0…

python爬虫实战——获取酷我音乐数据

嗨喽,大家好呀~这里是爱看美女的茜茜呐 开发环境: 版 本: python 3.8 编辑器:pycharm 2022.3.2 模块使用: requests >>> pip install requests 如何安装python第三方模块: win R 输入 cmd 点击确定, 输入安装命令 pip install…

【数据分享】1929-2023年全球站点的逐日最低气温数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、湿度等指标,其中又以气温指标最为常用!说到气温数据,最详细的气温数据是具体到气象监测站点的气温数据! 之前我们分享过1929-2023年全球气象站…

【云原生之kubernetes系列】--污点与容忍

污点与容忍 污点(taints):用于node节点排斥Pod调度,与亲和效果相反,即taint的node排斥Pod的创建容忍(toleration):用于Pod容忍Node节点的污点信息,即node节点有污点,也将新的pod创建…

GM8775C——DSI 转双通道 LVDS 发送器

1 产品概述 GM8775C 型 DSI 转双通道 LVDS 发送器产品主要实现将 MIPI DSI 转单 / 双通道 LVDS 功能, MIPI 支持 1/2/3/4 通道可选,每通道最高支持 1Gbps 速率,最大支持 4Gbps 速率。 LVDS 时钟频率高达 154MHz &#xff…

数据解构+算法(第07篇):动态编程!黄袍加身!

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 学习必须往深处挖&…

【数据分享】1929-2023年全球站点的逐月最高气温数据(Shp\Excel\无需转发)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、湿度等指标,其中又以气温指标最为常用!说到气温数据,最详细的气温数据是具体到气象监测站点的气温数据! 之前我们分享过1929-2023年全球气象站…

vue如何使用vuedraggable实现不同面板之间的拖拽排序,拖拽复制功能?【vuedraggable】

vuedraggable官方文档链接使用说明https://www.itxst.com/vue-draggable/re7vfyfe.htmlhttps://www.itxst.com/vue-draggable/re7vfyfe.html 效果图&#xff1a; 使用vuedraggable拖动左边的字段和逻辑到右边形成不同的规则校验 <!-- ****--date 2024-02-01 11:34****-…

私募证券基金动态-23年12月报

成交量&#xff1a;12月日均7,696.93亿元 2023年12月A股两市日均成交7,696.93亿元&#xff0c;环比下降12.39%、同比下降2.26%。12月整体21个交易日&#xff0c;无单日交易日成交金额过万亿&#xff0c;单日交易日最低成交金额为6,122.84亿元&#xff08;12月25日&#xff09;…

GPT-4 Vision调试任何应用,即使缺少文本日志 升级Streamlit七

GPT-4 Vision 系列: 翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式一翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式二翻译: GPT-4 Vision静态图表转换为动态数据可视化 升级Streamlit 三翻译: GPT-4 Vision从图像转换为完全可编辑的表格 升级St…

【C/Python】GtkApplicationWindow

一、C语言 GtkApplicationWindow 是 GTK 库中用于创建应用程序主窗口的一个控件。 首先&#xff0c;需要确保环境安装了GTK开发库。然后&#xff0c;以下是一个简单的使用 GtkApplicationWindow 创建一个 GTK 应用程序的示例&#xff1a; #include <gtk/gtk.h>static …

前端JavaScript篇之let、const、var的区别

目录 let、const、var的区别 let、const、var的区别 let、const和var是JavaScript中用于声明变量的关键字&#xff0c;它们之间有一些区别。 首先&#xff0c;var是在ES5中引入的关键字&#xff0c;而let和const是在ES6中引入的。在ES6之前&#xff0c;我们只能使用var来声明…

Thinkphp5.0.23远程代码执行漏洞复现

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将信息做其他用途&#xff0c;由Ta承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 1、漏洞介绍 使用Thinkphp5.x远程代码执行漏洞&#xf…

操作系统--进程、线程基础知识

一、进程 我们编写的代码只是一个存储在硬盘的静态文件&#xff0c;通过编译后就会生成二进制可执行文件&#xff0c;当我们运行这个可执行文件后&#xff0c;它会被装载到内存中&#xff0c;接着 CPU 会执行程序中的每一条指令&#xff0c;那么这个运行中的程序&#xff0c;就…

python爬虫-多线程-数据库——WB用户

数据库database的包&#xff1a; Python操作Mysql数据库-CSDN博客 效果&#xff1a; 控制台输出&#xff1a; 数据库记录&#xff1a; 全部代码&#xff1a; import json import os import threading import tracebackimport requests import urllib.request from utils im…

博客文章质量分数列表【分页、排序、搜索】

文章目录 一、分析二、代码1、前端代码2、后端代码 三、实现效果四、总结1、出现安全验证2、401 Unauthorized: [no body] 一、分析 官方提供的质量分查询入口&#xff1a;CSDN质量分 输入我们要查的文章即可&#xff0c;比如&#xff1a;https://blog.csdn.net/qq_36433289/a…

开发板——X210开发板的SD卡启动方式

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 参考博客&#xff1a; S5PV210 SD卡启动 - 简书 关于存储器的相关基础知识&#xff0c;见博文&#xff1a; 外存——SD卡/iNand芯片与S5PV210的SD/MMC/iNand控制器-CSDN博客 RAM、ROM和FLASH三…

了解WPF控件:TreeView常用属性与用法(十五)

引言 TreeView控件是WPF&#xff08;Windows Presentation Foundation&#xff09;中用于显示分层数据的常用控件。这个控件允许用户以树形结构展示数据&#xff0c;使得数据更加清晰易懂。在创建文件浏览器、组织结构图等应用程序时&#xff0c;TreeView控件非常有用。 Tree…

R语言入门笔记2.0

1.创建数据框 在R语言中&#xff0c;可以使用data.frame函数来创建数据框。以下是一个简单的示例&#xff0c;这段R语言代码创建了一个名为student的数据框&#xff0c;其中包含了学生的ID、性别、姓名和出生日期&#xff0c;首先创建一个包含学生出生日期的向量&#xff0c;再…

探秘本庄村果园预售系统的技术之旅

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…