一、概述
我们很多互联网项目首选的数据库就是MySql5.7,因为免费,支持数据库主从复制,读写分离,且语法简单,容易上手,虽然对sql的函数、触发器、存储过程有一定的了解,也能说出一些优化sql语句的方法,但这些只能说是对MySql的浅薄了解。
在当今这个社会,竞争异常的激烈,如果还只停留在表面的CRUD,那么是没有任何优势的,像现在的MySQL面试题,你能答出来吗?
说说MySQL中MVCC机制的原理?
MySQL的事务原理和实现?
MySQL数据主从复制的原理?
MySQL底层数据的存储结构?
如何使MySQL支持海量数据存储?
MySQL中的锁机制原理和实现?
MySQL索引机制?索引中涉及的数据结构和算法?
MySQL为何使用B+树作为索引结构?
B+树可以存放多少数据?
说说MySQL中间隙锁的实现原理?
InnoDB引擎为何会崩溃?说说其实现原理?
等等其他一系列高频面试
所以我们想对MySql有一个深入彻底的了解,就必须了解它的底层架构是怎么实现的。
今天就由我带领大家一块学习MySQL分层架构,深入了解MySQL底层实现原理、以及每层的作用,我们常见的Sql优化是在哪些层实现了优化。
二、架构详解
1、MySql的整体架构,如下图
- 由图中我们可以看到数据库架构主要由Service层和存储引擎层。
- Service层又分为连接器、分析器、优化器、执行器及缓存。所有跨存储引擎的功能都在这一层实现,如:函数、存储过程、触发器、视图等。
- 存储引擎是可插拔式的,目前主要的存储引擎有MyISAM、InnoDB、Memory等,MySQL5.5之前默认是MyISAM、之后是InnoDB。
2、连接器
- 连接器的主要作用是用来管理客户端的连接及身份认证。
- 客户端与Server端的连接采用的是TCP协议,经过三次握手,建立连接之后,连接器开始进行身份验证。
- 身份验证的代码
mysql -hlocalhost -P3306 -uroot -p
如果身份验证失败就会出现错误
ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password: YES)。
在这里,我们可以使用show processlist命令查看系统所有的连接信息
在上图中Command表示连接状态,Daemon表示后天进程,Query表示查询,Sleep表示看下连接。
3. 查询缓存
-
可以端查询数据不会直接去使用存储引擎查询数据,而是先在缓存查询数据是否存在。如果存在,直接返回,否则再执行一遍查询流程,查询结束后再把结果缓存起来,这样可以大大提高查询效率。
-
如果数据发生更改,将清空缓存,如执行update、insert、delete、alter等操作。
-
对于频繁更改的数据,缓存的命中率很低,使用缓存反而降低了读写性能,所以在MySQL8.0后就移除了缓存模块。
-
可以通过下面的命令查看缓存是否开启
show variables like ‘%query_cache%’;
4、分析器
- 主要对MySQL的词法和语法进行分析。
- 首先进行词法分析,分析出MySQL的关键字、以及每个词语代表的含义。然后进行语法分析,是否遵循MySQL的要求。
- MySQL识别语句中的列名、表名、select、update、insert、where等MySQL关键字,再根据语法规则判断sql语句是否符合满足语法,最终生成一个抽象的语法数(AST)。
- 比如:sql语句中少写个where关键字,就会提示错误。
mysql> use shop;
mysql> select * from sys_user id = 1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '= 1' at line 1
5. 优化器
- 在真正执行sql语句之前,还要经过优化器进行处理。
- 例如我们熟悉的执行计划 Explain 就是优化器生成的。
- 优化器主要有两个作用:逻辑优化和物理优化。
1、逻辑优化主要进行等价微词重写、条件化简、子查询消除、连接消除、语义优化、分组合并、选择下推、索引优化查询、表查询替换视图查询、Union替换or操作等。
2、物理优化主要通过贪婪算法,根据代价估值模型,估算出每种执行方式的代价。并使用索引优化表连接,最终生成查询执行计划。
如下图就是优化的详细过程:
如果想知道优化器估算结果信息,可以通过Explain查看,如:
mysql> explain select * from sys_user where id = 1;
6. 执行器
在优化器对sql语句的优化完成,并生成了执行计划后, 就会把执行计划传递给执行器。
执行器调用存储引擎接口,真正的执行查询。获取到存储引擎返回的结果,并把结果返回给客户端,至此查询语句结束。
7、整个查询过程,如图:
8、总结
本文主要对MySQL的底层架构进行了简单的介绍,同时对每层架构的作用都做了详细的说明。从中我们可以看出MySQL每层架构分工明确、逻辑清晰、深刻体现了架构设计中“高内聚、低耦合”的设计思想。我们平时在架构设计的时候,也要多学习这种分层的架构设计思想。