(一)Mysql篇---Mysql整体架构

MySql框架浅析

首先,上一张图先让各位看看大致结构:

6e2f6802a93a4063a8b7f4949e2b5c6d.png

从上到下,依次说一下结构:

连接层:这里主要是处理客户端和数据库连接的,直接使用的Tomcat的连接池,可以调整最大连接数;

服务层:这里主要包括了sql接口、解析器、优化器、缓存缓冲四个区域;

存储引擎层:就比如我们常见的InnoDB、MyISAM这些数据库引擎都存放在这一层;

文件系统层:涵盖了所有日志,包括数据、索引文件,存在在磁盘上;

当然,还包括了一个客户端,客户端主要负责编写sql,服务端则负责sql的执行和存储。

好啦,那接下来就具体来看看每一层都是怎么用的吧~

连接层

当然,Mysql的的通信协议是TCP/IP的,所以只要支持TCP/IP的都可以和Mysql进行通信,虽然如此,但是Mysql不支持HTTP,所以对于具体的需要用具体的协议进行连接,就比如jdbc,odbc这些,这里就简单过一下

529853c3bc7c472091ed7a6a310b0ac3.png

通过执行以上命令,会与mysql-server建立网络连接,并执行TCP的三次握手过程,随后服务端和客户端会建立session,来存储用户的用户名和密码信息,判断当前登录的用户信息是否在数据库中存在,如果不存在则会报1045的错误码,否则会对当前用户的权限进行校验,校验没有问题后,成功连接数据库。

连接成功后,数据库与客户端的通信是以半双工的形式进行通信的,即同一时刻只能允许一端进行传送数据,并且Mysql会建立一条线程来监听这条连接,时刻监听这条连接在做什么。

当然你也可以通过使用 show processlist命令来查看所有正在运行的线程:

60454db6ba0448868c7ff0a9dcc017af.png

  • Id:当前线程的ID值,可以利用这个ID,使用kill强杀线程。
  • User:当前线程维护的数据库连接,与之对应的用户是谁。
  • Host:与当前线程保持连接关系的客户端地址(IP+Port)。
  • db:目前线程在哪个数据库中执行SQL
  • Command:当前线程正在执行的SQL类型,如:
    • Create DB:正在执行创建数据库的操作。
    • Drop DB:正在执行删除数据库的操作。
    • Execute:正在执行预编译的SQLPreparedStatement)。
    • Close Stmt:正在关闭一个PreparedStatement
    • Query:正在执行普通的SQL语句。
    • Sleep:正在等待客户端发送SQL语句。
    • Quit:当前客户端正在退出连接。
    • Shutdown:正在关闭MySQL服务端。
  • Time:表示当前线程处于目前状态的时间,单位是秒。
  • State:表示当前线程的状态,有如下几种:
    • Updating:当前正在执行update语句,匹配数据做修改操作。
    • Sleeping:正在等待客户端发送新的SQL语句。
    • Starting:目前正在处理客户端的请求。
    • Checking table:目前正在表中查询数据。
    • Locked:当前线程被阻塞,其他线程获取了执行需要的锁资源。
    • Sending Data:目前执行完成了Select语句,正在将结果返回给客户端。
  • Info:一般记录当前线程正在执行的SQL,默认显示前一百个字符,查看完整的SQL可以使用show full processlist;命令。

其实从这个结果上来看,我们能够很明显的看到数据库中各个线程的信息,这条指令对于以后做线上排查时有很大的作用,目前先简单了解,接着来看看数据库连接池。

数据库连接池

连接池的最大线程数可以通过参数max-connections来控制,如果到来的客户端连接超出该值时,新到来的连接都会被拒绝,关于最大连接数的一些命令主要有两条:

  • show variables like '%max_connections%';:查询目前DB的最大连接数。
  • set GLOBAL max_connections = 120;:修改数据库的最大连接数为指定值。

数据库连接池主要也是使用了Tomcat的连接池,同样可以通过以下命令来查看连接数,

0950a7f376084792853f67049e5fa53e.png

  • Threads_cached:目前空闲的数据库连接数。
  • Threads_connected:当前数据库存活的数据库连接数。
  • Threads_createdMySQL-Server运行至今,累计创建的连接数。
  • Threads_running:目前正在执行的数据库连接数。

Threads_cached这个属性看起来是和缓存有关的,其实也没错,当客户端与mysql断开连接后,mysql不会立马销毁,而是会将当前线程放入到连接池,等到下次有客户端连接的时候,会继续使用这个线程,这样就不用再重新分配资源了,但是这个不会无限大,就和线程池一样,池的大小是由限制的,一般在32左右。这样做一方面是为了提升性能,另一方面是为了节约资源。

服务层

这一层是Mysql主要的功能层,包含了sql解析、词法分析、优化等等,但是你会看到还有一个管理服务的东西,那个嘛就是全局的工具,也是Mysql的基础设施。

835d9d94ec6f40a3859142c663f6e930.png

这里就大概介绍一下每一个功能块具体作用~

    SQL接口组件     

        这一层主要是当客户端与数据库建立好连接后,接收客户端传来的sql,像DML、DCL、存储过程、触发器等等,然后交给各个层去进行处理,处理完成后收取结果,这一层就相当于是一个接口层 。

SQL中会分为五大类:

  • DML:数据库操作语句,比如update、delete、insert等都属于这个分类。
  • DDL:数据库定义语句,比如create、alter、drop等都属于这个分类。
  • DQL:数据库查询语句,比如最常见的select就属于这个分类。
  • DCL:数据库控制语句,比如grant、revoke控制权限的语句都属于这个分类。
  • TCL:事务控制语句,例如commit、rollback、setpoint等语句属于这个分类。

        解析器

这一层主要是获取到sql后去对sql进行词法分析、语法分析等等就比如:

select * froms data_factory;

这个就会报错,因为froms不是sql指定的关键字,正确sql语句应该如下:

select * from data_factory;

        优化器

这一层主要是对获取到的sql进行优化,通过设置的索引来选择通过哪条索引可以更好的提高sql的执行速率。

其实,可以看看下面这个博客sql的执行全过程你会发现还有一个执行器的概念,但是实际上这个执行器是并不存在的,我们在前面说到的在连接层用户确认权限确认后,服务端会生成一个线程来监督当前连接具体在干什么,其实这个线程就是我们所说的执行器。

一条sql语句执行的全过程-CSDN博客

        缓存和缓冲区

这一层在上面sql语句执行的全过程中也具体说过了,这一层主要是获取到sql后,判断缓存中有没有这条sql语句,如果有的话就使用缓存的sql语句,如果没有的话就将该条sql放入缓存,等下次执行同一条sql语句的时候,就是用缓存中的sql语句,这样做主要也是为了减少磁盘操作,因为在之前的写的博客中我们也提到了Mysql是基于磁盘存储的,所以就需要考虑到磁盘IO操作对性能影响。

  • show global variables like "%query_cache_type%";:查询缓存是否开启。
  • show global variables like "%query_cache_size%";:查询缓存的空间大小。
  • show status like'%Qcache%';命令查询缓存相关的统计信息。

b8487f73f70f4424961f00b1cc608f66.png

        存储引擎层

这一层主要存放了Mysql的各个存储引擎,像Oracle是只有一个存储引擎的,而Mysql是个例外,主要是因为MySQL的开源特性,所以存在很多很多款不同的存储引擎实现,MySQL为了能够正常搭载不同的存储引擎运行,因此引擎层是被设计成可拔插式的,也就是可以根据业务特性,为自己的数据库选择不同的存储引擎。

show variables like '%storage_engine%';命令来查看当前所使用的引擎。

其他存储引擎如下:

44dba4fdfede4621ac2268bad0a8a92b.png

文件系统层

1ec8b46bfc8d443aa8149f19be6fc01f.png

这一层主要可分为两个板块:①日志板块。②数据板块。

        日志板块

MySQL中主要存在七种常用的日志类型,如下:

  • binlog二进制日志,主要记录MySQL数据库的所有写操作(增删改)。
  • redo-log重做/重写日志,MySQL崩溃时,对于未落盘的操作会记录在这里面,用于重启时重新落盘(InnoDB专有的)。
  • undo-logs撤销/回滚日志:记录事务开始前[修改数据]的备份,用于回滚事务。
  • error-log:错误日志:记录MySQL启动、运行、停止时的错误信息。
  • general-log常规日志,主要记录MySQL收到的每一个查询或SQL命令。
  • slow-log:慢查询日志,主要记录执行时间较长的SQL
  • relay-log:中继日志,主要用于主从复制做数据拷贝

上述我们一般见的多的可能就前三个,后面也可以出篇文章大概讲一下~

        数据板块

前面聊到过,MySQL的所有数据最终都会落盘(写入到磁盘),而不同的数据在磁盘空间中,存储的格式也并不相同,因此再列举出一些MySQL中常见的数据文件类型:

  • db.opt文件:主要记录当前数据库使用的字符集和验证规则等信息。
  • .frm文件:存储表结构的元数据信息文件,每张表都会有一个这样的文件。
  • .MYD文件:用于存储表中所有数据的文件(MyISAM引擎独有的)。
  • .MYI文件:用于存储表中索引信息的文件(MyISAM引擎独有的)。
  • .ibd文件:用于存储表数据和索引信息的文件(InnoDB引擎独有的)。
  • .ibdata文件:用于存储共享表空间的数据和索引的文件(InnoDB引擎独有)。
  • .ibdata1文件:这个主要是用于存储MySQL系统(自带)表数据及结构的文件。
  • .ib_logfile0/.ib_logfile1文件:用于故障数据恢复时的日志文件。
  • .cnf/.iniMySQL的配置文件,Windows下是.ini,其他系统大多为.cnf

以上就是对Mysql结构的大致说明,当然想要了解一个东西肯定是需要由外之内了解,就像拼图一样就没有觉得这块知识已经拼到了你的知识结构体系中~

 

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

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

相关文章

精益思维在新能源汽车研发中的应用体现

近年来,新能源汽车作为绿色出行的重要载体,其研发与生产模式正经历着深刻的变革。精益思维,这一源自制造业的管理理念,正逐步渗透并深刻影响着新能源汽车的研发过程,不仅提升了产品质量与生产效率,还促进了…

汽车级DC-DC转换器英飞凌TLF35584

上汽荣威都在用的汽车级DC-DC转换器英飞凌TLF35584 今天平台君从IPBrain数据库中给大家带来的一款由Infineon(英飞凌)推出的一款多路输出安全电源芯片,具备高可靠性和安全性。适用于汽车电子系统中的多种应用场景,如车身控制、安全气囊、防抱死制动系统,电子稳定控制系统等。…

数据结构:堆的应用

堆排序 假定有一组数据极多的数,让我们进行排序,那我们很容易想到一种经典的排序方法,冒泡排序,我们对冒泡排序的时间复杂度进行分析: 显然,冒泡排序的时间复杂度是O(n^2),当数据量…

软考(中级-软件设计师)计算机系统篇(1024)

#1024程序员节|正文# 六、树和二叉树 6.1 树的基本概念 描述结果结点的度子结点的个数树的度最大结点的度叶子结点没有子结点的结点内部结点除根结点和叶子结点外的结点父节点有子结点的结点子节点有父结点的结点兄弟节点有同一个父结点的结点层次4层 6.2 二叉树的基本概念…

【Javaee】网络原理—TCP协议的核心机制

前言 TCP/IP五层协议是互联网中的主流模型,为网络通信提供了一个稳固的框架。 主要包含了应用层,传输层,网络层,数据链路层,物理层。 本篇主要介绍传输层的TCP协议的核心机制 一. 确认应答(ack&#xf…

线程本地变量-ThreadLocal

一、ThreadLocal简介 ThreadLocal叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可…

量子纠错--shor‘s 码

定理1 (量子纠错的条件) C是一组量子编码,P是映射到C上的投影算子。假设是一个算子元素描述的量子操作,那么基于量子编码C,存在一个能对抗描述的噪声的纠错操作R的充要条件是 对某个复元素厄米矩阵成立。 将算子元素称为导致的错误。如果这样…

[C++进阶数据结构]红黑树(半成品)

我们讲完了AVL树,它追求绝对平衡,从而导致插入和删除性能较差。今天我们来讲讲,红黑树,它是另一种平衡二叉搜索树,它追求相对平衡,使得增删查改的性能都极佳,时间复杂度皆为O(log2N)。 一、红黑树的概念 …

CSS3 动画相关属性实例大全(三)(columns、filter、flex、flex-basis 、flex-grow、flex-shrink属性)

CSS3 动画相关属性实例大全(三) (columns、filter、flex、flex-basis 、flex-grow、flex-shrink属性) 本文目录: 一、columns属性(设置元素的列宽和列数) 二、filter属性(调整图像、背景和边…

Ribbon客户端负载均衡策略测试及其改进

文章目录 一、目的概述二、验证步骤1、源码下载2、导入IDE3、运行前修改配置4、策略说明5、修改策略 三、最终结论四、改进措施1. 思路分析2. 核心代码3. 测试页面 一、目的概述 为了验证Ribbon客户端负载均衡策略在负载节点失效的情况下,是否具有故障转移的功能&a…

【逆向基础】十七、PE文件格式(二)

一、简介 本篇章主要PE文件组成部分中使用的结构体;根据结构体的成员变量去了解各个字节的含义。(ps:我们依旧以”cmd.exe“为例展开解析;) 二、DOS Header 1、结构体:IMAGE_DOS_HEADER IMAGE_DOS_HEADER结构体的背景是为了兼…

忘记7-zip文件7-zip文件,还可以解压zip文件吗?

文件压缩与解压已成为我们日常处理数据和存储信息的常规操作。7-Zip,作为一款开源且功能强大的文件压缩工具,凭借其高压缩率、支持多种格式以及免费使用的特点,赢得了广大用户的青睐。然而,出于保护文件内容安全的考虑&#xff0c…

基于NVIDIA NIM平台—生成属于自己的DIY食谱

目录 一、介绍NVIDIA NIM平台 二、生成DIY食谱Demo 三、小结 一、介绍NVIDIA NIM平台 NVIDIA NIM(Nvidia Inference Microservices)平台是NVIDIA推出的一个微服务套件,旨在加速生成式AI模型在云端、数据中心和工作站上的部署和使用。以下是…

怎么区分主谓宾I love you与主系表I am fine? 去掉宾语看句子完整性 主系表结构则侧重于描述主语的状态、特征或性质

主谓宾与主系表是英语句子结构中的两种基本类型,它们在关注点、动词分类以及句子完整性方面有所区别。具体分析如下: 关注点 主谓宾I love you:主谓宾结构主要关注动作和影响对象之间的关系[1]。这种结构强调的是动态和行为,通常描…

4K双模显示器7款评测报告

4K双模显示器7款评测报告 HKC G27H7Pro 4K双模显示器 ROG华硕 XG27UCG 4K双模显示器 雷神 ZU27F160L 4K双模显示器 泰坦军团 P275MV PLUS 4K双模显示器 外星人(Alienware)AW2725QF 4K双模显示器 SANC盛色 D73uPro 4K双模显示器 ANTGAMER蚂蚁电竞 …

MySql中表的约束

​ 本篇中将会介绍关于 MySql 数据库中的表的约束,关于表的约束其实约束的是表中的数据类型,因为有的数据类型很单一,需要我们添加一些额外的约束,才能更好的保证数据的合法性,从业务逻辑角度保证数据的正确性&#xf…

Notepad++通过自定义语言实现日志按照不同级别高亮

借助Notepad的自定义语言可以实现日志的按照不同级别的高亮&#xff1b; 参考&#xff1a; https://blog.csdn.net/commshare/article/details/131208656 在此基础上做了一点修改效果如下&#xff1a; xml文件&#xff1a; <NotepadPlus><UserLang name"Ansibl…

leetCode算法题爬楼梯递归写法

题目&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2输出&#xff1a;2解释&#xff1a;有两种方法可以爬到楼顶。1. 1 阶 1 阶2. 2 阶 …

GPIO输入和输出

参考视频&#xff1a;2.1 [GPIO]4种输出模式_哔哩哔哩_bilibili 输出&#xff1a;通过写0或者写1&#xff0c;控制引脚输出低电压或高电压。 输入&#xff1a;通过读取引脚是0还是1&#xff0c;判断引脚输入的是高电压还是低电压。 输出 推挽开漏通用通用输出推挽通用输出开漏…

Asp.net Core MVC 动态路由

动态路由 asp.net core 3.0 就支持了 // 映射关系public class TranslationDatabase{private static Dictionary<string, Dictionary<string, string>> Translations new Dictionary<string, Dictionary<string, string>>{{"en", new Dictio…