您当前的位置:首页 > 电脑百科 > 数据库 > MYSQL

6步带你看懂MySQL 整体架构

时间:2020-05-04 12:33:16  来源:  作者:

MySQL 在整体架构上分为 Server 层和存储引擎层。其中 Server 层,包括连接器、查询缓存、分析器、优化器、执行器等,存储过程、触发器、视图和内置函数都在这层实现。数据引擎层负责数据的存储和提取,如 InnoDB、MyISAM、Memory 等引擎。在客户端连接到 Server 层后,Server 会调用数据引擎提供的接口,进行数据的变更。

6步带你看懂MySQL 整体架构

连接器

负责和客户端建立连接,获取用户权限以及维持和管理连接。

通过show processlist来查询连接的状态。在用户建立连接后,即使管理员改变连接用户的权限,也不会影响到已连接的用户。默认连接时长为 8 小时,超过时间后将会被断开。

简单说下长连接:

1. 优势:在连接时间内,客户端一直使用同一连接,避免多次连接的资源消耗。

2. 劣势:在MySQL执行时,使用的内存被连接对象管理,由于长时间没有被释放,会导致系统内存溢出,被系统kill. 所以需要定期断开长连接,或执行大查询后,断开连接。MySQL 5.7 后,可以通过mysql_rest_connection初始化连接资源,不需要重连或者做权限验证。

查询缓存

当接受到查询请求时,会现在查询缓存中查询(key/value保存),是否执行过。没有的话,再走正常的执行流程。

但在实际情况下,查询缓存一般没有必要设置。因为在查询涉及到的表被更新时,缓存就会被清空。所以适用于静态表。在MySQL8.0后,查询缓存被废除。

分析器

1. 词法分析:如识别select,表名,列名,判断其是否存在等。

2. 语法分析:判断语句是否符合MySQL语法。

优化器

确定索引的使用,join表的连接顺序等,选择最优化的方案。

执行器

在具体执行语句前,会先进行权限的检查,通过后使用数据引擎提供的接口,进行查询。如果设置了慢查询,会在对应日志中看到rows_examined来表示扫描的行数。在一些场景下(索引),执行器调用一次,但在数据引擎中扫描了多行,所以引擎扫描的行数和rows_examined并不完全相同。

不预先检查权限的原因:如像触发器等情况,需要在执行器阶段才能确定权限,在优化器阶段无法验证。

MySQL 日志模块

如前面所说,MySQL整体分为Server层和数据引擎层,而每层也对应了自己的日志文件。如果选用的是InnoDB引擎,对应的是redo log文件。Server层则对应了binlog文件。至于为什么存在了两种日志系统,咱们往下看。

 

1. redo log

redo log是InnoDB特有日志,为什么要引入redo log呢,想象这样一个场景,MySQL为了保证持久性是需要把数据写入磁盘文件的。我们知道,在写入磁盘时,会进行文件的 IO,查找操作,如果每次更新操作都这样的话,整体的效率就会特别低,根本没法使用。

既然直接写入磁盘不行,解决方法就是先写进内存,在系统空闲时再更新到磁盘就可以了。但光更新内存不行,假如系统出现异常宕机和重启,内存中没有被写入磁盘的数据就会被丢掉,数据的一致性就出现问题了。

这时redo log就发挥了作用,在更新操作发生时,InnoDb会先写入redo log日志(记录了数据发生了怎么样的改变),然后更新内存,最后在适当的时间再写入磁盘。先写日志,在写磁盘的操作,就是常说到的WAL(Write-Ahead- Logging)技术。

redo log的出现,除了在效率上有了很大的改善,还保证了MySQL具有了crash-safe的能力,在发生异常情况下,不会丢失数据。

在具体实现上redo log的大小是固定的,可配置一组为 4 个文件,每个文件1GB,更新时对四个文件进行循环写入。

6步带你看懂MySQL 整体架构

write pos记录当前写入的位置,写完就后移,当第写入第4个文件的末尾时,从第0号位置重新写入。

check point表示当前可以擦除的位置,当数据更新到磁盘时,check point就向后移动。

write pos和check point之间的位置,就是可以记录更新操作的空间。当write pos追上check point ,不在能执行新的操作,先让check point去写入一些数据。

可以将innodb_flush_log_at_trx_commit设置成1,开启redo log持久化的能力。

 

2. binlog

binlog则是Server层的日志,主要用于归档,在备份,主备同步,恢复数据时发挥作用,常见的日志格式有row, mixed, statement三种。

可以通过sync_binlog=1开启binlog写入磁盘。

这里对binlog和 redo进行下区分:

  • 所有者不同:binlog是 Server层,所有引擎都可使用。redo log是 InnoDB特有的。

  • 类型不同:binlog是逻辑日志,记录的是语句的原始逻辑(比 statement)。redo log是物理日志,记录某个数据页被做了怎样的修改。

  • 数据写入的方式不同:binog日志会一直追加,而redo log是循环写入。

  • 功能不同:binlog用于归档,而redo log用于保证crash-safe。

3. 两阶段提交

一条更新语句,在InnoDB引擎下的更新过程如下。在更新内存后,将写入redolog和写入 binlog放在一起成为一个事务最后一起写入redo log和 binlog的过程就是常说的两阶段提交。用于保证当有意外情况发生时,数据的一致性。

6步带你看懂MySQL 整体架构

这里假设下,如果不采用两阶段提交会发生什么?

  • 先写redo log后写binlog假设在写入redo log后,MySQL发生异常重启,此时binlog没有写入。在重启后,由于redolog已经写入,此时数据库的内容是没有问题的。但此时,如果想要拿binlog进行备份或恢复,发现会少了最后一条的更新逻辑,导致数据不一致。

  • 先写binlog和redo log. binlog写入后,MySQL异常重启,redo log没有写入。此时重启后,发现redo log没有成功写入,认为这个事务无效,而此时binlog却多了一条更新语句,拿去恢复后自然数据也是不一致的。

再分析下两阶段提交的过程:

  • 在写redo log prepare阶段奔溃,重启后,发现redo log没写入,回滚此次事务。

  • 如果在写binlog时奔溃,重启后,发现binlog未被写入,回滚操作

  • 如果在写入redo log和binlog后崩溃,重启后,发现没提交,则进行commit。

总结

在文章开始部分,说明了MySQL的整体架构分为Server层和引擎层,并简要说明了一条语句的执行过程。接着MySQL在5.5后选用InnoDB作为默认的引擎,就是因为比原生的MyISAM多了事务以及crash-safe的能力。

而crash-safe就是由redo log实现的。与redo log类似的日志文件还有binlog,是Server引擎的日志,用于归档和备份数据。

最后提到了,为了保证数据的一致性,将redo log和binlog放入相同的事务中,也就是常提到的两阶段提交操作。

End.

作者:以终为始

来源:博客园

本文为转载分享,如侵权请联系后台删除



Tags:MySQL 架构   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
了解掌握MySQL数据库的架构设计、文件系统,有利于更全面、系统的掌握MySQL数据库,是进阶精通MySQL的必修课。MySQL逻辑架构总体分为客户端连接器(Connectors)和服务器端(MySQL...【详细内容】
2020-07-06  Tags: MySQL 架构  点击:(100)  评论:(0)  加入收藏
常常会问道,怎样使用MySQL能达到高性能。以下内容是结合其他技术同仁的总结和自我实践整理的20个开源数据库设计原则。...【详细内容】
2020-05-21  Tags: MySQL 架构  点击:(52)  评论:(0)  加入收藏
MySQL 在整体架构上分为 Server 层和存储引擎层。其中 Server 层,包括连接器、查询缓存、分析器、优化器、执行器等,存储过程、触发器、视图和内置函数都在这层实现。数据引擎...【详细内容】
2020-05-04  Tags: MySQL 架构  点击:(80)  评论:(0)  加入收藏
▌简易百科推荐
作者:雷文霆 爱可生华东交付服务部 DBA 成员,主要负责Mysql故障处理及相关技术支持。爱好看书,电影。座右铭,每一个不曾起舞的日子,都是对生命的辜负。 本文来源:原创投稿 *爱可生...【详细内容】
2021-12-24  爱可生    Tags:MySQL   点击:(7)  评论:(0)  加入收藏
生成间隙(gap)锁、临键(next-key)锁的前提条件 是在 RR 隔离级别下。有关Mysql记录锁、间隙(gap)锁、临键锁(next-key)锁的一些理论知识之前有写过,详细内容可以看这篇文章...【详细内容】
2021-12-14  python数据分析    Tags:MySQL记录锁   点击:(18)  评论:(0)  加入收藏
binlog 基本认识 MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二...【详细内容】
2021-12-14  linux上的码农    Tags:mysql   点击:(13)  评论:(0)  加入收藏
为查询优化你的查询 大多数的MySQL服务器都开启了查询缓存。这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的。当有很多相同的查询被执行了多次的时候,这些查...【详细内容】
2021-12-09  元宇宙iwemeta    Tags:mysql   点击:(15)  评论:(0)  加入收藏
测试的目的和原因,公司有很多程序员,每个程序员对数据库和表结构都有自己的理解。而且每个程序员的理解往往是以效率考虑。既然都是为了效率考虑,那么我就来测试一下究竟哪种使...【详细内容】
2021-12-08  吴彬的分享    Tags:Mysql数据库   点击:(14)  评论:(0)  加入收藏
当你们考虑项目并发的时候,我在部署环境,当你们在纠结使用ArrayList还是LinkedArrayList的时候,我还是在部署环境。所以啊,技术不止境,我在部环境。今天这篇文章缕一下在同一台服...【详细内容】
2021-12-08  秃头码哥    Tags:MySQL数据库   点击:(17)  评论:(0)  加入收藏
对于数据分析来说,MySQL使用最多的是查询,比如对数据进行排序、分组、去重、汇总及字符串匹配等,如果查询的数据涉及多个表,还需要要对表进行连接,本文就来说说MySQL中常用的查询...【详细内容】
2021-12-06  笨鸟学数据分析    Tags:MySQL   点击:(21)  评论:(0)  加入收藏
在学习SQL语句之前,首先需要区分几个概念,我们常说的数据库是指数据库软件,例如MySQL、Oracle、SQL Server等,而本文提到的数据库是指数据库软件中的一个个用于存储数据的容器。...【详细内容】
2021-11-24  笨鸟学数据分析    Tags:SQL语句   点击:(23)  评论:(0)  加入收藏
概述以前参加过一个库存系统,由于其业务复杂性,搞了很多个应用来支撑。这样的话一份库存数据就有可能同时有多个应用来修改库存数据。比如说,有定时任务域xx.cron,和SystemA域...【详细内容】
2021-11-05  Java云海    Tags:分布式锁   点击:(31)  评论:(0)  加入收藏
MySQL的进阶查询 一、 按关键字排序 使用ORDERBY语句来实现排序排序可针对一个或多个字段ASC:升序,默认排序方式 【升序是从小到大】DESC:降序 【降序是从大到小】ORDER BY的...【详细内容】
2021-11-05  Java热点    Tags:SQL语句   点击:(28)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条