1、 MySql架构
MySql也是提供服务的一个程序,他提供的这个服务名字叫“数据库”,MySql总体来说可以分为Server层和存储引擎层两部分。
架构图如下:
1.1 Server层
主要包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数
(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
1.2 引擎/Store层
MySQL的存储引擎采用的是插拔式的,我们可以自己扩充或者选择合适的。
存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。也就是说如果我们在create table时不指定表的存储引擎类型,默认会给你设置存储引擎为InnoDB。若要建表时指定存储引擎,可以在建表语句后面加上“ENGINE=存储引擎名称”,示例如下:
CREATE TABLE `test` (
`id` bigint NOT NULL,
`code` varchar(255) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
在查看表信息时,可以看到对应存储引擎选择的是Innodb
2、 具体功能分析
2.1 连接器
MySql作为一个个开源数据库,客户端的种类非常多,有Navicat、jdbc、SQLyog、MySql front等,而这些客户端与Server层连接时,工作的就是连接器。连接器负责跟客户端建立连接、获取权限、维持和管理连接。连接命令一般是这么写的:
mysql ‐h host[数据库地址] ‐u root[用户] ‐p root[密码] ‐P 3306
具体的链接信息以及权限可以在MySql本身的user表中查看,这里不展开。
2.2 缓存查询
当我们使用命令行时,一般是如下操作步骤:
mysql>show databases; 显示所有数据库
mysql>use dbname; 打开数据库
mysql>show tables; 显示数据库mysql中所有的表
mysql>describe user; 显示表mysql数据库中user表的列信息
这里我们与连接器的链接已经建立完成,可以对表进行查询了。MySql有一个缓存机制,在5.6以后的版本中查询缓存需要将表达式显式的写在sql语句中,在8.0后的版本中缓存查询已被移除。我们可以在数据库实例中使用语句查询配置:
show global variables;
可以看到配置中已没有query_cache_type相关的数据。
2.3 词法分析器
当不使用缓存查询时,就会使用语句查询了。查询的命令就是我们写的sql语句,MySql会分析sql语句中的语法和变量,起这个作用的就是词法分析器。
词法分析器对sql语句的分析和执行主要分六个步骤:
- 词法分析
- 语法分析
- 语义分析
- 构造执行树
- 生成执行计划
- 计划的执行
SQL语句的分析分为词法分析与语法分析,mysql的词法分析由MySQLLex[MySQL自己实现的]完成,语法分析由Bison生
成。关于语法树大家如果想要深入研究可以参考这篇wiki文章:https://en.wikipedia.org/wiki/LR_parser。那么除了Bison外,Java当中也有开源的词法结构分析工具例如Antlr4,ANTLR从语法生成一个解析器,可以构建和遍历解析树,可以在IDEA工具当中安装插件:antlr v4 grammar plugin。经过bison语法分析之后,会生成一个这样的语法树:
至此我们分析器的工作任务也基本圆满了。接下来进入到优化器。
2.4 查询优化器
MySql对我们的语句完成分析之后,会根据表的索引以及语句之间的关联生成多套查询方案,然后分析多套方案的效率,最终选择效率最高的那一个方案,然后下一步进入执行器执行sql。
2.5 查询执行器
开始执行时,首先校验权限,校验通过后执行器打开表进行操作,按照语句增删改查后返回数据。
3、 bin-log归档
MySql还有一个重要的功能就是bin-log归档功能,简而言之就是会记录你所有增删改查的操作,方便回滚。bin-log有以下几个特点:
- Bin-log在MySQL的Server层实现(引擎共用)
- Bin-log为逻辑日志,记录的是一条语句的原始逻辑
- Bin-log不限大小,追加写入,不会覆盖以前的日志
我们要是用bin-log功能的话,需要在配置文件中开启,修改如下配置:
# 配置开启binlog
log‐bin=/usr/local/mysql/data/binlog/mysql‐bin
# 注意5.7以及更高版本需要配置本项:server‐id=123454(自定义,保证唯一性);
#binlog格式,有3种statement,row,mixed
# statement: 记录的是sql语句本身的逻辑(记录的是产生结果的过程)(可能出现主从数据不一致) 占用的资源较少
# row: 记录的是当前sql语句执行前后的结果 (记录的是产生的结果) 占用资源较多
@ minxed:两种综合起来,
binlog‐format=ROW
#表示每1次执行写入就与硬盘同步,会影响性能,为0时表示,事务提交时mysql不做刷盘操作,由系统决定
sync‐binlog=1
开启bin-log会数据库性能,但是也多了一份保证,不用担心数据被误删。下面是bin-log相关命令:
mysql> show variables like '%log_bin%'; 查看bin‐log是否开启
mysql> flush logs; 会多一个最新的bin‐log日志
mysql> show master status; 查看最后一个bin‐log日志的相关信息
mysql> reset master; 清空所有的bin‐log日志