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
:正在执行预编译的SQL
(PreparedStatement
)。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_created
:MySQL-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语句执行的全过程中也具体说过了,这一层主要是获取到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/.ini
:MySQL
的配置文件,Windows
下是.ini
,其他系统大多为.cnf
。
以上就是对Mysql结构的大致说明,当然想要了解一个东西肯定是需要由外之内了解,就像拼图一样就没有觉得这块知识已经拼到了你的知识结构体系中~