1、InnoDB的磁盘结构

1)系统表空间

2)用户表空间

3)rodolog 文件组

4)磁盘文件逻辑结构

文件->段->区->页->行

InnoDB对数据的存取是以页为单位的,一个数据页默认是16k

2、InnoDB的内存结构

1)buffer pool

1.数据页

2.索引页

3.ChangeBuffer修改缓冲区(InsertBuffer插入缓冲区)

为了提高辅助索引(非聚集索引,除主键之外的索引)更新性能,暂时先把辅助索引的更新内容写到ChangeBuffer中。后台有线程定时更新。

4.自适应hash索引

为了提高查询性能,由InnoDB自己维护了一个hash索引。用户无法干预。

参考:https://juejin.im/post/6847902217270198286

5.锁信息和数据字典

2)redo log buffer重做日志缓冲区

1.redolog是一个顺序写的日志文件。wal(write ahead log)模式。顺序写比随机写效率要高。使用redo log暂存提交成功的数据。如果一旦系统崩溃,可以使用redo log恢复数据。

2.redo log buffer就是一个缓冲区,定时将缓冲区的数据保存到磁盘。

默认1s保存一次。默认在执行commit操作之前刷新redo log buffer。

	参数:innodb_flush_log_at_trx_commit控制redo log的落盘时机
* 当属性值为0时,事务提交时,不会对重做日志进行写入操作,而是等待主线程按时写入每秒写入一次;
* 当属性值为1时,事务提交时,会将重做日志写入文件系统缓存,并且调用文件系统的fsync,将文件系统缓冲中的数据真正写入磁盘存储,确保不会出现数据丢失;
* 当属性值为2时,事务提交时,也会将日志文件写入文件系统缓存,但是不会调用fsync,而是让文件系统自己去判断何时将缓存写入磁盘。
3)双写缓冲区
数据落盘需要执行双写操作,需要使用到双写缓冲区。稍后详解。

3、数据落盘

1)脏页

当更新数据commit之后,数据不是马上更新到磁盘。把数据更新到缓冲池中对应的数据页和索引页中。此时就会造成内存中的数据页和索引页与磁盘上的数据页不一致,就形成了脏页。

2)CheckPoint

执行脏页落盘操作的。

sharp checkpoint:在关闭数据库的时候,将buffer pool中的脏页全部刷新到磁盘中

fuzzy checkpoint:模糊落盘

1、Master Thread Checkpoint;

会以每秒或者每10秒一次的频率,将部分脏页从内存中刷新到磁盘,参数可调。

2、FLUSH_LRU_LIST Checkpoint;

使用LRU算法需要把一些数据页移除,但是数据页是脏页,需要执行checkpoint。

3、Async/Sync Flush Checkpoint;

redo log文件快写满时。

Async:当需要落盘的日志超过日志文件的75%并且小于90%时。

sync:当需要落盘的日志超过日志文件超过90%时。

4、Dirty Page too much Checkpoint

bufferPool缓冲池脏页太多

Dirty Page 由[innodb_max_dirty_pages_pct]配置,innodb_max_dirty_pages_pct的默认值在innodb 1.0之前是90%,之后是75%

3)双写落盘double write

当脏页落盘过程中,是使用双写操作执行落盘的。

1.把要落盘的数据写先写入双写缓冲区2m大小的双写缓冲区。

2.把双写缓冲区的数据写入系统表空间中的双写区。

3.把双写缓冲区的数据写入用户表空间中。

	redolog中记录的是数据页中修改了哪些内容,并不是完整的数据页。

	场景1:系统表空间中的数据页写坏了,可以通过用户表空间的数据页+redolog恢复。
场景2:系统表空间中的数据页写完了,用户表空间写坏了。可以通过系统表空间的数据页恢复。 通过双写机制保证数据落盘过程万无一失。

mysql InnoDB架构的更多相关文章

  1. MySQL InnoDB存储引擎体系架构 —— 索引高级

    转载地址:https://mp.weixin.qq.com/s/HNnzAgUtBoDhhJpsA0fjKQ 世界上只两件东西能震撼人们的心灵:一件是我们心中崇高的道德标准:另一件是我们头顶上灿烂的星 ...

  2. MySQL高级知识- MySQL的架构介绍

    [TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...

  3. MySQL 体系架构

    MySQL 体系架构 本篇文章是对mysql体系结构进行了详细的分析介绍,需要的朋友参考下 上面一图是mysql的概览图,我们从上往下看, 我们把上面一图一分为二,我们可以吧它分为两个部分, 1,是c ...

  4. MySQL 主从架构配置详解

    无论是哪一种数据库,数据的安全都是至关重要的,因此熟练掌握数据库的安全备份功能,是作为开发人员,特别是后端开发人员的一项必备技能.MySQL 数据库内建的复制功能,可以帮助我们对数据进行异地备份,读写 ...

  5. Mysql基准测试详细解说(根据慕课网:《打造扛得住Mysql数据库架构》视频课程实时笔录)

    什么是基准测试 基准测试是一种测量和评估软件性能指标的活动用于建立某个时刻的性能基准,以便当系统发生软硬件变化时重新进行基准测试以及评估变化对性能的影响. 我们可以这样认为:基准测试是针对系统设置的一 ...

  6. MySQL InnoDB 存储引擎探秘

    在MySQL中InnoDB属于存储引擎层,并以插件的形式集成在数据库中.从MySQL5.5.8开始,InnoDB成为其默认的存储引擎.InnoDB存储引擎支持事务.其设计目标主要是面向OLTP的应用, ...

  7. MySQL逻辑架构概述

    1.MySQL逻辑架构 MySQL逻辑架构图 MySQL逻辑架构分四层 1.连接层:主要完成一些类似连接处理,授权认证及相关的安全方案. 2.服务层:在 MySQL据库系统处理底层数据之前的所有工作都 ...

  8. Mysql MGR架构误操作引发的问题处理

    [背景介绍] 故障方描述:一次用户刷权限的时候不小心把数据库用户表记录删掉了,执行之后发现不对后重建用户,杀掉进程后重新MGR启动报错. [报错信息] 2018-06-13T12:47:41.4055 ...

  9. mysql MHA架构搭建过程

    [环境介绍] 系统环境:Red Hat Enterprise Linux 7 + 5.7.18 + MHA version 0.57 系统 IP 主机名 备注 版本 xx系统 192.168.142. ...

随机推荐

  1. 轻松理解HTTP缓存策略

    上一篇文章我写了koa-static的源码解析,其中用到了HTTP的缓存策略,给返回的静态文件设置了一些缓存的头,比如Cache-Control之类的.于是我就跟朋友讨论了一下HTTP的缓存策略: 朋 ...

  2. JDK8新特性详解(一)

    虽然JDK8已经出来了N久,其新特性也在日益改变着我们的编码习惯和风格.虽然有些新特性用起来很顺手,但是总是傻傻分不清到底是哪个版本的.趁今天有时间,我们就来总结一下,JDK8有哪些能提升我们开发效率 ...

  3. Python3和高性能全文检索引擎Redisearch进行交互

    安装 pip install redisearch 使用 from redisearch import Client, TextField # 创建一个客户端与给定索引名称 client = Clie ...

  4. Python -- 修改、添加和删除元素

    大多数列表将是动态的,这意味着列表创建后,将随着程序的运行增删元素. 修改列表元素 修改列表元素的语法与访问列表元素的语法类似.要修改列表元素,可指定表名和要修改的元素指引,再指定该元素的新值. #代 ...

  5. PPT技术干货1(上)——设计审美

    序言 PPT直接反映了一个人的能力和态度,PPT能直接反映出老板最看重的4个关键能力: 逻辑思维:全局思考,洞察关键 数据思维:数据分析,指导决策 设计思维:美观大方,彰显专业 工作效率:效率高,出活 ...

  6. java实现读取excel文件内容

    package excel; import java.io.FileInputStream; import java.io.InputStream; import java.text.SimpleDa ...

  7. Idea创建Maven项目时,没有自动添加Artifacts

    可能的原因是没有进行更新,因为第一次创建时由于要下载东西,所以pom文件是自动改变的,如果没有设置自动更新maven项目,就可能出现这种情况 这时候只要去maven project中点击一下更新按钮, ...

  8. Raft算法系列教程4:日志不一致的解决

    网络不可能一直处于正常情况,因为Leader或者某个Follower有可能会崩溃,从而导致日志不能一直保持一致.因此存在以下三种情况: (1)Follower缺失当前Leader上存在的日志条目.(2 ...

  9. java字符统计+字符串压缩

    要实习了.突然发现自己好像什么都不会,就去看看题吧.在网上看到一个字符串压缩的题.看了一眼,感觉用python很简单.一个for循环+字典就可以搞定. 但是呢,主要还是java.下面就用java来实现 ...

  10. reactor模式:多线程的reactor模式

    上文说到单线程的reactor模式 reactor模式:单线程的reactor模式 单线程的reactor模式并没有解决IO和CPU处理速度不匹配问题,所以多线程的reactor模式引入线程池的概念, ...