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

发布于:2024-10-18 ⋅ 阅读:(6) ⋅ 点赞:(0)

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