IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> InnoDB引擎架构 -> 正文阅读

[大数据]InnoDB引擎架构

1、架构总览

2、Buffer Pool(缓冲池)介绍

缓冲池就是一块内存区域,通过内存的速度来弥补磁盘速度较慢对数据库性能的影响。

在数据库中进行读取页的操作,首先将从磁盘读到的页存放在缓冲池中,这个过程称为将页“Fix”在缓冲池中。下一次再读相同的页时,首先判断该页是否在缓冲池中。若在缓冲池,则称该页在缓冲池中被命中,直接读取该页。否则,读取磁盘上的页。

对于数据库中页的修改操作,则首先修改缓冲池中的页,然后再以一定的频率刷新到磁盘上。

缓冲池中页默认大小为16K。

页从缓冲池中刷新回磁盘的操作并不是在每次页发生更新时触发,而是一种称为Checkpoint的机制刷新回磁盘。

2.1、Buffer Pool(缓冲池)的管理方式

为了缓存管理的效率,缓冲池被实现为页链表;使用最近最少使用 (LRU) 算法从缓存中淘汰。即最频繁使用的页在LRU列表的前端,而最少使用的页在LRU列表的尾端。当缓冲池不能存放新读取到的页时,将首先释放LRU列表中尾端的页。

InnoDB对传统的LRU做了优化。在InnoDB的存储引擎中,LRU列表中加入了midpoint位置。新读取到的页,不会直接放入到LRU列表的首部,而是放到LRU列表的midpoint位置(默认为LRU列表长度的5/8处,参数 innodb_old_blocks_pct 控制)。同时为了避免全表扫描等非频繁查询操作,所产生的大量的页使得真正的热点数据被移除出LRU列表。故引入参数innodb_old_blocks_time,用于表示页读取到mid位置后需要等待多久才会被加入到LRU列表的热端。

参数

默认值

说明

innodb_old_blocks_pct

默认值37。

(100-37)/100=5/8

innodb_old_blocks_time

默认值1000。

表示1s

2.2、名词解析

LRU列表:管理已经读取的页

Free列表:可用的空闲页

FLush列表:管理脏页,被称为脏页列表。

LRU列表+Free列表+其他页(自适应哈希)= buffer pool size

在LRU列表中的页被修改后,称该页为脏页。

脏页既存在LRU列表,也存在Flush列表中。

3、Change Buffer介绍

3.1、实现原理

当需要更新一个数据页时,如果数据页在内存中就直接更新,而如果这个数据页还没有在内存中的话,在不影响数据一致性的前提下,InnoDB 会将这些更新操作缓存在 change buffer 中,这样就不需要从磁盘中读入这个数据页了。在下次查询需要访问这个数据页的时候,将数据页读入内存,然后执行 change buffer 中与这个页有关的操作。通过这种方式就能保证这个数据逻辑的正确性。

3.2、作用

将更新等操作先记录在 change buffer,减少读磁盘,语句的执行速度会得到明显的提升。而且,数据读入内存是需要占用 buffer pool 的,所以这种方式能够避免占用内存,提高内存利用率。

3.3、容量

Change Buffer默认占Buffer Pool的25%,最大设置占用50%:

show variables like '%innodb_change_buffer_max_size%'

4、Log Buffer(重做日志缓冲)介绍

4.1、Redo Log记录的内容

redo log里记录了数据页的修改以及change buffer新写入的信息。

4.2、Redo Log Buffer和Redo Log File

由于Redo Log File(重做日志文件)打开并没有使用O_DIRECT选项,为了确保每次日志都写入Redo Log File(重做日志文件),在每次将Redo Log Buffer(重做日志缓冲)写入文件系统缓存后,InnoDB存储引擎都需要调用一次fsync操作。

由于fsync的效率取决于磁盘的性能,因此InnoDB存储引擎允许当事务提交时,Redo Log可以先bu写入Redo Log File(重做日志文件),而是等待一个时间周期后再执行fsync操作,显然这可以显著提高数据库的性能。但是当数据库发生宕机时,由于部分日志未刷新到磁盘,因此会丢失最后一段时间的事务。

属性

取值

说明

innodb_flush_log_at_trx_commit

用来控制重做日志刷新到磁盘的策略。

0

事务提交时不进行写入重做日志操作。

1 (默认值)

事务提交时调用一次fsync操作

2

事务提交时将重做日志写入重做文件,但仅写入文件系统的缓存中,不进行fsync操作。

5、Change Buffer和Redo Log Buffer之间的联系

5.1、记录的内容不同

change buffer只是针对如果更改的数据所在页不在内存中才暂时储存在change buffer中。而redo log会记录一个事务内进行数据更改的所有操作。

5.2、产生的效益目标不同

redo log 主要节省的是随机写磁盘的 IO 消耗(转成顺序写),而 change buffer 主要节省的则是随机读磁盘的 IO 消耗。

5.3、在内存中所处的位置不同

Change Buffer属于Buffer Pool的一部分。Redo Log Buffer独立存在于Buffer Pool之外。

5.4、应用场景不同

对于写多读少的业务来说,页面在写完以后马上被访问到的概率比较小,此时 change buffer 的使用效果最好。

redo log 来实现 crash-safe 能力。

有了 redo log,InnoDB 就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为 crash-safe。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-04-04 12:18:09  更:2022-04-04 12:19:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:23:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码