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

MySql框架浅析

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

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

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

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

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

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

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

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

连接层

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

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

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

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

  • 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的连接池,同样可以通过以下命令来查看连接数,

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

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

服务层

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

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

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%';命令查询缓存相关的统计信息。

存储引擎层

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

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

其他存储引擎如下:

文件系统层

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

日志板块

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结构的大致说明,当然想要了解一个东西肯定是需要由外之内了解,就像拼图一样就没有觉得这块知识已经拼到了你的知识结构体系中~

相关推荐
好奇的菜鸟2 小时前
如何在IntelliJ IDEA中设置数据库连接全局共享
java·数据库·intellij-idea
tan180°2 小时前
MySQL表的操作(3)
linux·数据库·c++·vscode·后端·mysql
满昕欢喜3 小时前
SQL Server从入门到项目实践(超值版)读书笔记 20
数据库·sql·sqlserver
DuelCode3 小时前
Windows VMWare Centos Docker部署Springboot 应用实现文件上传返回文件http链接
java·spring boot·mysql·nginx·docker·centos·mybatis
幽络源小助理4 小时前
SpringBoot基于Mysql的商业辅助决策系统设计与实现
java·vue.js·spring boot·后端·mysql·spring
Hello.Reader4 小时前
Redis 延迟排查与优化全攻略
数据库·redis·缓存
YuTaoShao4 小时前
【LeetCode 热题 100】48. 旋转图像——转置+水平翻转
java·算法·leetcode·职场和发展
ai小鬼头5 小时前
AIStarter如何助力用户与创作者?Stable Diffusion一键管理教程!
后端·架构·github
简佐义的博客5 小时前
破解非模式物种GO/KEGG注释难题
开发语言·数据库·后端·oracle·golang
爬山算法5 小时前
MySQL(116)如何监控负载均衡状态?
数据库·mysql·负载均衡