MySQL 5.7 整体架构

参考文章: https://www.php.cn/mysql-tutorials-423218.html

一.MySQL整体架构图

1.第一层:网络连接层, 对客户端的连接处理、安全认证、授权等,每个客户端连接都会在服务端拥有一个线程,每个连接发起的查询都会在对应的单独线程中执行。服务器上维护一个线程池,避免为每个连接创建和销毁线程。当客户端连接到MySQL服务器时,服务器对其进行认证。可以通过用户名与密码认证,也可以通过SSL证书进行认证。登录认证后,服务器还会验证客户端是否有执行某个查询的操作权限。这一层并不是MySQL所特有的技术。

2.第二层:服务层,MySQL的核心服务功能层,该层是MySQL的核心,包括查询缓存,解析器,解析树,预处理器,查询优化器。主要进行查询解析、分析、查询缓存、内置函数、存储过程、触发器、视图等,select操作会先检查是否命中查询缓存,命中则直接返回缓存数据,否则解析查询并创建对应的解析树。

3.第三层:存储引擎,负责数据的存储和提取,MySQL服务器通过API与存储引擎通信,屏蔽了各种引擎之间的差异,常见的存储引擎有:InnoDB、MyISAM,两者的详细介绍以后会继续深入分析。

4.第四层 : 物理层 , 数据存储与日志, 将数据存放在硬盘上

mysql的物理文件包括三块:

1)日志文件

  1-1)Error log 错误日志:记录遇到的所有严重的错误信息、每次启动关闭的详细信息;

  1-2)Binary log 二进制日志:也就是binlog,记录所有修改数据库的操作;

  1-3)Query log 查询日志:记录所有查询操作,体积较大,开启后对性能有影响;

  1-4)Slow Query log 慢查询日志:记录所有执行时间超过long_query_time的sql语句和达到min_examined_row_limit条距离的语句;

  1-5)InnoDB redo log:记录InnoDB所做的物理变更和事务信息;

2)数据文件

  2-1).frm文件:表结构定义信息

  2-2).MYD文件:MyISAM引擎的数据文件;

  2-3).MYI文件:MyISAM引擎的索引文件;

  2-4).ibd文件和.ibdata文件:InnoDB的数据和索引;.ibdata配置为共享表空间时使用,.ibd配置为独享表空间时使用;

3)其它文件

  3-1)系统配置文件:/etc/my.cnf

  3-2) pid文件:存储自己的进程ID

  3-3)socket文件:连接客户端使用

二.SQL 语句的执行流程

我们发送一条SQL语句,其在MySQL中的整体流程究竟是什么样的?

  • 用户先通过Navicat等客户端与服务端建立连接,这边需要用户名和密码进行认证,也可以用SSL证书进行认证。

  • 登录成功后,MySQL会根据相应权限来判断该角色是否拥有一些表的权限等。

  • 如果拥有相关权限,当用户发送一条查询select语句时,MySQL先查询缓存,如果已经有这条语句的缓存,则直接返回,如果没有则执行下面的流程。如果是更新update,新增insert,删除delete则不查询缓存,直接执行下面的流程。

  • MySQL会将SQL语句解析为树,然后对其进行校验,比如关键字是否正确,关键字顺序是否正确,表名是否正确,字段是否正确等。如果认证没有成功,则直接返回错误。如果认证成功了,则直接下面流程。

  • MySQL对解析树进行查询优化,因为多个SQL可能表达的意思一样,但是消耗的时间可能差别很大。所以MySQL对针对表的存储引擎找到最优的语句执行,也就是生成相应的执行计划。

  • 使用上面生成的执行计划,来调用存储引擎层的接口。也就是我们平时使用的explain,其可以用来查看是否走索引,消耗的时间等信息。

  • 不同的存储引擎会到相应的物理存储位置,找到相应的数据,封装并返回结果。

  • 如果拿到了结果集,并且为select语句,MySQL会将结果放入到缓存中,避免下次再进行相同的操作而造成资源的消耗,同时返回给客户端结果,至此,一条SQL语句的执行过程结束啦。

 

三. MySQL的锁与事务

1.MySQL中的锁:

MySQL在处理并发读写的时候,分别使用共享锁(写锁)和排它锁(读锁)对共享资源高并发操作,在加锁的时候,最好能锁定所需数据,控制锁的粒度、提高并发能力,MySQL提供了两种重要的锁策略:

  • 标记锁:锁定整张表,在对表进行插入更新删除操作时,需要先获得写锁,锁定整张表,其他读写操作都会被阻塞。读锁之间不会阻塞。

  • 行级锁:锁定数据所在行,行级锁只在存储引擎层实现,可以很好支持并发处理。

2.MySQL的事务:

  • 事务的实现原理:MySQL中的事务是在存储引擎中实现的,所以上层的服务是不会管理事务的。默认情况下,MySQL自身提供了两种事务型的存储引擎,分别是InnnoDB和NDB Cluster。
    在默认情况下,MySQL事务采用自动提交模式,即如果没有显示的开启一个事务,那么每一次的查询都将被当做一个事务执行自动提交。当然,也可以通过设置来改变这种自动提交的模式。如果想开启自动提交,可以通过命令SET AUTOCOMMIT = 1或SET AUTOCOMMIT =ON来设置;关闭自动提交模式,可以通过命令SET AUTOCOMMIT = 0或SET AUTOCOMMIT = OFF来设置。
    InnoDB存储引擎采用的是两阶段锁定协议,在事务执行的过程中,InnoDB会根据隔离级别在需要加锁的时候自定加锁,锁只有在事务提交或回滚的时候才会释放。当然,也可以显示的加锁,如使用SELECT FOR UPDATE,也可以使用服务层实现的LOCK TABLES和UNLOCK TABLES。

  • 事务日志:即一种特殊的操作记录日志,存储引擎在修改表数据的时候,只修改内存中的拷贝,然后将修改行为记录保存到硬盘上的事务日志中,对事务日志的保存操作采用追加的方式,保存操作是顺序IO,相对于存储引擎直接将数据持久化到硬盘的随机IO高效的多。事务日志保存后,内存中被修改的数据在后台可以慢慢的持久化到硬盘。如果事务日志保存成功了,而内存中被修改的数据没有成功的写入硬盘,发生了系统崩溃,存储引擎会在重启时自动恢复这部分数据。

  • 事务的特性:ACID

  • 原子性:一个事务的所有操作要么全部执行要么全部失败回滚

  • 一致性:事务执行结果使数据库从一个一致性状态变成另一个一致性状态

  • 隔离性:事务操作提交之前,操作结果对其他事务不可见

  • 持久性:事务提交后,所有的修改操作会永久保存到数据库中

  • 事务的隔离级别:SQL标准定义了四种隔离级别,分别是read uncommitter,read committed,repeatable read,serializable,可以通过set transaction isolation level命令来设置隔离级别

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值