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

news2024/10/19 8:46:07

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

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

相关文章

OpenEuler 软件安装与服务管理全攻略

在 OpenEuler 操作系统的日常使用中,软件安装和服务管理是至关重要的操作环节。本文将以严谨的方式为大家详细阐述 OpenEuler 中安装软件的多种方法,涵盖 RPM、DNF 的概念与操作命令以及操作实验,同时还包括源代码软件的安装方法和使用 syste…

JDK-23与JavaFX的安装

一、JDK-23的安装 1.下载 JDK-23 官网直接下载,页面下如图: 2.安装 JDK-23 2.1、解压下载的文件 找到下载的 ZIP 文件,右键点击并选择“解压到指定文件夹”,将其解压缩到您希望的目录,例如 C:\Program Files\Java\…

react18中如何实现同步的setState来实现所见即所得的效果

在react项目中,实现添加列表项,最后一项自动显示在可视区域范围!! 实现效果 代码实现 import { useState, useRef } from "react"; import { flushSync } from "react-dom"; function FlushSyncRef() {con…

MySQL面试专题-索引

一、MySQL为什么要选择B树来存储索引? MySQL的索引选择B树作为数据结构来进行存储,其本质原因在于可以减少IO次数,提高查询效率,简单来说就是保证在树的高度不变的情况下可以存储更多的数据。 (一)IO角度 在…

【状态机DP】【记忆化搜索及翻译递推】【空间优化】力扣3290. 最高乘法得分

给你一个大小为 4 的整数数组 a 和一个大小 至少为 4 的整数数组 b。 你需要从数组 b 中选择四个下标 i0, i1, i2, 和 i3&#xff0c;并满足 i0 < i1 < i2 < i3。你的得分将是 a[0] * b[i0] a[1] * b[i1] a[2] * b[i2] a[3] * b[i3] 的值。 返回你能够获得的 最大…

Chromium form表单post提交过程分析c++

form表单get提交参考之前文章Chromium 前端form表单提交过程分析c-CSDN博客 一、表单post提交测试例子&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>菜鸟教程(runoob.com)</title> </head&…

【C++11】可变模板参数详解

个人主页&#xff1a;chian-ocean 文章专栏 C 可变模板参数详解 1. 引言 C模板是现代C编程中一个非常强大且灵活的工具。在C11标准中&#xff0c;引入了可变模板参数&#xff08;variadic templates&#xff09;&#xff0c;它为模板编程带来了革命性改变。它的出现允许我们…

第五课:Python学习之if语句

判断&#xff08;if&#xff09;语句 目标 开发中的应用场景if 语句体验if 语句进阶综合应用 01. 开发中的应用场景 生活中的判断几乎是无所不在的&#xff0c;我们每天都在做各种各样的选择&#xff0c;如果这样&#xff1f;如果那样&#xff1f;…… 程序中的判断 # 定义…

faust,一个神奇的 Python 库!

大家好&#xff0c;今天为大家分享一个神奇的 Python 库 - faust。 Github地址&#xff1a;https://github.com/robinhood/faust 在分布式系统和实时数据处理的世界里&#xff0c;消息流处理&#xff08;Stream Processing&#xff09;变得越来越重要。Faust 是一个 Python 库…

Linux 命令:每日一学,一文说尽打包压缩工具实践

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] 文章目录&#xff1a; 0x00 前言简述 前面&#xff0c;我们介绍了Linux中文件查找find命令以及与之联用最勤的xargs命令&#xff0c;作者以一个个简单的实例给各位看友展示了在运维中两个命令的使…

智慧供排水管网在线监测为城市安全保驾护航

一、方案背景 随着城市化进程的不断推进&#xff0c;城市供排水管网作为城市基础设施的关键组成部分&#xff0c;其安全稳定的运行对于确保城市居民的日常生活、工业生产活动以及整个生态环境的健康具有至关重要的作用。近年来&#xff0c;由于各种原因&#xff0c;城市供排水管…

Python基础:16、Python数据容器

1&#xff09;数据容器入门 一种可以存储多个元素的Python数据类型 数据容器&#xff1a;一种可以存储多个元素的Python数据类型数据容器包括&#xff1a;list&#xff08;列表&#xff09;、tuple&#xff08;元组&#xff09;、str&#xff08;字符串&#xff09;、set&…

k8s的安装与部署

一、部署 1、实验环境 k8s-master172.25.254.200k8s-node1172.25.254.10k8s-node2172.25.254.20docker-node1 172.25.254.100(harbor仓库&#xff09; 2、相关操作 1.基础配置 所有节点关闭selinux和防火墙 systemctl disabled firewalld systemctl stop firewalld grubb…

商贸物流产业大脑:打造“产-供-销,仓-运-配”全流程供应链

商贸物流产业大脑&#xff1a;打造“产-供-销&#xff0c;仓-运-配”全流程供应链 在全球化竞争日益激烈的今天&#xff0c;商贸物流产业的效率和创新力成为企业能否脱颖而出的关键因素。然而&#xff0c;信息不对称、资源配套不准确、系统独立运作等痛点严重阻碍了商贸物流产…

# LangGraph 入门(二)- ChatBot demo

在这个快速入门 demo 中&#xff0c;我们将会使用 langGraph 构建一个基本的对话机器人和可是使用网络搜索的机器人。通过这个 demo 我们来快速对 langgraph 有一定感知。 概念补充 顾名思义langGraph是基于图&#xff08;Graph Theory&#xff09;的&#xff0c;如果你学过图…

【算法】约瑟夫环问题

据说著名的犹太历史学家Josephus有过以下故事&#xff0c; 罗马人占领乔塔帕特&#xff0c; 39个犹太人与Josephus和他的朋友躲在洞中&#xff0c;其中39个犹太人决定自杀&#xff0c; &#xff0c;他们的自杀方式是41个人绕成一圈&#xff0c;第一个人报数1&#xff0c;报数到…

RK3588的demo板学习

表层的线宽是3.8mil: 换层之后线宽变成了4.2mil: (说明对于一根线&#xff0c;不同层线宽不同) 经典&#xff1a; 开窗加锡&#xff0c;增强散热&#xff0c;扩大电流&#xff1a; R14的作用&#xff1a;与LDO进行分压&#xff0c;降低LDOP的压差从而减小其散热&#xff1a;第…

如何系统的从0到1学习大模型?有哪些书籍推荐?

大模型应用得好&#xff0c;不仅需要海量的基础数据、大规模算力、综合人工智能发展成果的技术&#xff0c;还需要政产学研用各方的共同推进。 大模型不仅能生成结果、生成数据&#xff0c;更能传递价值观。应用于我国的大模型需要懂中文、懂中国文化、懂中国国情。大模型是全…

【Linux系统编程】环境基础开发工具使用

目录 1、Linux软件包管理器yum 1.1 什么是软件包 1.2 安装软件 1.3 查看软件包 1.4 卸载软件 2、Linux编辑器-vim 2.1 vim的概念 2.2 vim的基本操作 2.3 vim的配置 3、Linux编译器-gcc/g 3.1 gcc编译的过程​编辑​编辑​编辑 3.2 详解链接 动态链接 静态链接 4…

纯HTML实现标签页切换

纯HTML实现标签页切换 实现原理&#xff1a; HTML结构&#xff1a; 使用无序列表&#xff08;<ul>&#xff09;创建标签导航。每个标签是一个列表项&#xff08;<li>&#xff09;&#xff0c;包含一个链接&#xff08;<a>&#xff09;。每个链接指向对应的内…