MySql底层原理探解

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语句的分析和执行主要分六个步骤:

  1. 词法分析
  2. 语法分析
  3. 语义分析
  4. 构造执行树
  5. 生成执行计划
  6. 计划的执行

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有以下几个特点:

  1. Bin-log在MySQL的Server层实现(引擎共用)
  2. Bin-log为逻辑日志,记录的是一条语句的原始逻辑
  3. 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日志

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值