一、结构概况
MySQL大概来讲分为两大层:
service层 和 引擎层
service层:主要包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数 (如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
引擎层: 存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在 最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎
二、连接器
市面上有很多链接数据库的客户端:navicat,mysql front,jdbc,SQLyog等。这些 客户端要向mysql发起通信都必须先跟Server端建立通信连接,而建立连接的工作就是有连接器完成的。
三、查询缓存
MySQL 拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。key 是查询的语句,value 是查询的结果。
但是在大多数情况下,我们都用不到缓存,因为只要有对一个表的更新,这个表上所有的查询缓存都会被清空。因此很可能你费劲地把结果存起来,还没使用呢,就被一个更新全清空了。对于更新压力大的数据库来说,查询缓存的命中率 会非常低。
mysql8.0已经移除了查询缓存功能
四、分析器
一条sql语句执行后,如果没有被缓存命中,那就会被分析器来对它做解析。
经过6个主要分析:
-
词法分析 :
分析是否是合法的词,如果不是直接返回错误信息 -
语法分析 :
分析语法是否合法;
Java当中也有开源的词法结构分析工具例如Antlr4,ANTLR从语法生成一个解析器,可以构建和遍历解析树,可以在IDEA 工具当中安装插件:antlr v4 grammar plugin.
经过bison语法分析之后,会生成一个这样的语法树:
-
语义分析 :
-
构造执行树
-
生成执行计划
-
计划的执行
五、优化器
经过了分析器,MySQL 就知道你要做什么了。在开始执行之前,还要先经过优化器的处理。
如果有多个索引,优化器会帮你选择用哪个索引; 多个表join的时候,会优化join的顺序;等等。
优化器的作用就是决定选择使用哪一个方案。
六、执行器
开始执行的时候,要先判断一下你对这个表 T 有没有执行查询的权限,如果没有,就会返回没有权限的错误。
如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。 通过调用引擎接口去执行具体的操作。
七、bin-log文件
数据库的数据恢复,可以用bin-log文件。
因为我们的SQL执行时,会将sql语句的执行逻辑记录在我们的bin-log文件当中。
binlog是Server层实现的二进制日志,他会记录我们的创建、修改、删除的操作,也就是不管什么引擎,都会有binlog文件的。
如果,我们误删了数据库,可以使用binlog进行归档!要使用binlog归档,首先我们得记录binlog,因此需要先开启MySQL的 binlog功能。