专栏首页HUC思梦的java专栏初探Mysql架构和InnoDB存储引擎

初探Mysql架构和InnoDB存储引擎

前言

mysql相信大家都不陌生了,分享之前我们先思考几个面试题:

1.undo log和redo log了解过吗?它们的作⽤分别是什么?

2.redo log是如何保证事务不丢失的?

3.mysql的事务是先提交还是先刷盘?

4.更新操作为什么不直接更新磁盘反而设计这样⼀个复杂的InnoDB存储引擎来完成?

下面我们开始逐步探索Mysql架构的运行流程。

前台操作触发Mysql服务器执⾏请求

前台⽤户各种操作触发后台sql执⾏,通过web项⽬中⾃带的数据库连接池:如dbcp、c3p0、druid等,与数据库服务器的数据库连接池建⽴⽹络连接;

数据库连接池中的线程监听到请求后,将接收到的sql语句通过SQL接⼝响应给查询解析器,

查询解析器将sql按照sql的语法解析出查询哪个表的哪些字段,查询条件是啥;

再通过查询优化器处理,选择该sql最优的⼀套执⾏计划,然后执⾏器负责调⽤存储引擎的⼀系列接⼝,执⾏该计划⽽完成整个sql语句的执行,如下图所示:

InnoDB存储引擎-缓冲池中完成更新的基本操作

具体执⾏这些执⾏计划得要存储引擎来完成,比如⾸次更新users表中id=10的这条数据,缓冲池中⼀开始肯定没有该条数据的,

得要先从磁盘中将被更新数据的原始数据加载到缓冲池中(这⾥涉及到的innodb buffer暂时不讲)。

同时为了保证并发更新数据安全问题,会对这条数据先加锁,防⽌其他事务进⾏更新。

接着将更新前的值先备份写⼊到undo log中(便于事务回滚时取旧数据),⽐如update语句即存储被更新字段之前的值。

最后更新缓存⻚中的数据为最新的数据,⾄此就完成了在缓冲池中的执⾏流程,如下图所示:

Redo Log和BinLog保证事务的可靠性

缓冲池中更新完数据后,需要将本次的更新信息顺序写到Redo Log⽇志以及Binlog⽇志中(此时信息还在内存中),

Redo Log刷盘策略由innodb_flush_log_at_trx_commit属性值来定,

0:不会写到磁盘
,宕机会导致已提交事务数据丢失

1:数据过来即写磁盘,做到教据零丢失但是效率会很低

2:写到os cache,每秒刷新一次到磁盘,宕机最多丢失1s的数据,速度够快

Binlog刷盘策略由sync_binlog属性来定,

1:强制刷盘;0:写入os cache。

⼀般我们为了保证数据不丢失会配置双1策略,

Redo Log落盘后,写Binlog落盘,再将Binlog的⽂件名、⽂件所在路径信息以及commit标记给同步顺序写到Redolog中(其中commit标记是否更新到Redo Log中,是判定事务是否成功提交的⼀个⽐较重要的标准),

Redo Log和BinLog分别在物理和逻辑层⾯为本次事务、提供数据上的⼀致性保障,如下图所示

将事务的操作持久化

前⾯⼀些列操作执⾏成功后,InnoDB存储引擎后台有⼀个IO线程,会在数据库压⼒的低峰期间时如凌晨时分,

将缓冲池中被事务更新、但还没来得及写到磁盘中的数据(脏数据,因为磁盘数据和内存数据已经不⼀致了)给刷到磁盘中,完成事务的持久化。

面试题解答

1.undo log和redo log了解过吗?它们的作⽤分别是什么?

undo log和redo log是mysql中InnoDB存储引擎的基本组成:

(1)undo log保存了事务执⾏前数据的值,以便于事务回滚时能回到事务执⾏前的数据版本,多次更

新会有undo log的版本链;

(2)redo log在物理层⾯上记录了事务操作的⼀系列信息,保证就算遇到mysql宕机等因素还没来得

及将数据刷到磁盘⾥,通过redo log也能恢复事务提交的数据。

2.redo log怎样保证事务不丢失的?

当⼀个事务提交成功后,虽然缓冲池中的数据不⼀定来得及⻢上落地到磁盘中,但是redo log记录的

事务信息持久化到磁盘中了、且含有commit标记,此时如果mysql宕机导致缓冲池中的、已经被事务更新

过的内存数据丢失了,此时在mysql重启时,将磁盘中的redo log中将事务变更信息给加载到缓冲池中,

保证事务信息不会丢失。或者redo log刷盘了,binlog写成功了,在重启时会⾃动给上commit标记,在重

放数据。

3.事务是先提交还是先刷盘?

事务先提交后刷盘;

1.Redo log刷盘成功->2.Binlog刷盘->3.BinLog名称和⽂件路径信息、commit标志写到Redo log

中,事务两阶段提交的⽅式来保证。

4.更新操作为什么不直接更新磁盘反⽽设计这样⼀个复杂的InnoDB存储引擎来完成?

直接更新磁盘是随机IO写,存在磁盘地址寻址操作,性能⾮常低,承载不了⾼并发场景;

⽽转换为InnoDB中,内存⾼速读写、redo log和undo log顺序写磁盘性能相对于随机IO写性能会⾼

的多,⽽这种性能上的提⾼⾜以抵消这种架构上带来的复杂,可在⼀定QPS内承载⾼并发场景。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 初探InnoDB存储引擎的架构设计

    首先,InnoDB会判读缓冲池里是否存在 id = 1 这条数据,如果不存在则从磁盘中加载到缓冲池中,而且还会对这行数据加独占锁,防止多个sql同时修改这行数据...

    Java技术江湖
  • MySQL InnoDB 存储引擎探秘

    在MySQL中InnoDB属于存储引擎层,并以插件的形式集成在数据库中。从MySQL5.5.8开始,InnoDB成为其默认的存储引擎。InnoDB存储引擎支持事...

    烂猪皮
  • MySQL - 存储引擎初探

    存储引擎是 MySQL 中具体与文件打交道的子系统,它是根据 MySQL AB 公司提供的文件访问层抽象接口定制的一种文件访问机制,这种机制就叫作存储引擎 。

    小小工匠
  • MySQL-体系结构以及常用存储引擎MyISAM和InnoDB初探

    http://www.searchdoc.cn/rdbms/mysql/dev.mysql.com/doc/refman/5.7/en/index.com.co...

    小小工匠
  • mysql 谈谈innodb存储引擎

    5.7版本引入了模式自动转换的功能,但该语法依然保留了。 另外一个有趣的点是,在5.7版本中,你可以通过设置session_track_transactio...

    Java架构师历程
  • Mysql 学习 --- innodb存储引擎

    1.MySQL数据库区别于其他数据库的最重要的一个特点就是其插件式的表存储引擎。MySQL插件式的存储引擎架构提供了一系列标准的管理和服务支持,这些标准与存储引...

    用户4158112
  • MySQL MyISAM和InnoDB存储引擎的比较

    MyISAM是MySQL的默认存储引擎,基于传统的ISAM类型,支持全文搜索,但不是事务安全的,而且不支持外键。每张MyISAM表存放在三个文件中:frm 文件...

    用户7657330
  • 谷歌、脸书、魔兽世界都在用!InnoDB是什么?有哪些关键特性?

    导读:InnoDB是事务安全的MySQL存储引擎,设计上采用了类似于Oracle数据库的架构。通常来说,InnoDB存储引擎是OLTP应用中核心表的首选存储引擎...

    华章科技
  • MySQL基础篇(05):逻辑架构图解和InnoDB存储引擎详解

    可以通过如下命令查看连接配置信息:SHOW VARIABLES LIKE '%connect%';可以看到最大连接和每个连接占用的内存等相关配置。

    知了一笑
  • Mysql引擎介绍及InnoDB逻辑存储结构

    摘自https://www.rathishkumar.in/2016/04/understanding-mysql-architecture.html

    码农编程进阶笔记
  • MySQL 存储引擎 MyISAM 与 InnoDB 区别

    存储引擎 Storage engine:MySQL 中的数据、索引以及其他对象是如何存储的,是一套文件系统的实现。

    用户1289394
  • MySQL的组件及InnoDB存储引擎

    在《MySQL的体系结构》一文中,说互联网应用的数据是数据库的数据,这种是说法不够严谨的,其实对于网站来说所有的信息都可以看成是数据,包括图片、文本、文档、音视...

    搬砖俱乐部
  • MySQL InnoDB 存储引擎原理浅析

    本文主要基于MySQL 5.6以后版本编写,多数知识来着书籍《MySQL技术内幕++InnoDB存储引擎》,今年的多数学习知识只写在笔记里,较为零散,最近稍有时...

    程序员小强
  • MySQL 体系架构简介

    松哥原创的 Spring Boot 视频教程已经杀青,感兴趣的小伙伴戳这里-->Spring Boot+Vue+微人事视频教程

    江南一点雨
  • MySQL InnoDB索引:存储结构

    此小结与索引其实没有太多的关联,但是为了便于理解索引的内容,添加此小结作为铺垫知识。

    AlbertZhang
  • InnoDB 存储引擎之索引和优化

    数据库优化可以说是后台开发中永恒的话题,数据库的性能通常是整个服务吞吐量的瓶颈之所在。

    三哥
  • MySQL核心知识学习之路(1)

    作为一个后端工程师,想必没有人没用过数据库,跟我一起复习一下MySQL吧,本文是我学习《MySQL实战45讲》的总结笔记的第一篇,总结了MySQL的基础架构、一...

    Edison Zhou
  • MySQL - 锁机制初探

    InnoDB 行锁是通过对索引数据页上的记录(record)加锁实现的。主要实现算法有 3 种:Record Lock、Gap Lock 和 Next-key ...

    小小工匠
  • MySQL存储引擎MyISAM与InnoDB的区别

    在MySQL 5.1之前的版本中,默认的搜索引擎是MyISAM,从MySQL 5.5之后的版本中,默认的搜索引擎变更为InnoDB。

    黄啊码

扫码关注云+社区

领取腾讯云代金券