MySQL InnoDB存储架构【1】——内存架构

MySQL InnoDB 架构简介

参考:MyQL官方文档

mysql innodb 存储引擎分两个架构,内存架构,磁盘架构
接下来将介绍两个架构的各个部分做一个简单的介绍
只是一个概念性的介绍,不做具体的分析

在这里插入图片描述

一、内存架构

内存架构由四个部分组成,缓存池(Buffer Pool), 更改缓冲区(Change Buffer), 日志缓存区(Log Buffer), 自适应哈希索引。

1. 缓存池

存放常用的表数据和索引数据。采用链表的形式实现,以页的形式组织,采用 LRU 算法老化不常用的数据

链表示例图
链表示例图

  • 3/8 的区域用来存放 旧子列表 (old sublist)
  • 中点(midpoint) 是新字列表(new sublist)与 旧字列表(old sublist)的分界点
  • 当发生用户查询(select 语句查询)或者 数据库预读(read ahead)操作时,InnoDB 读取 page 到 buffer pool 时,先将page 放在 old sublist 的 head
  • 访问list中的page, 会使 page 移动到 new sublist 的 head
  • 当 page 被移动到 old sublist 的 tail 是,page 将从 buffer pool 中删除

2. 更改缓冲区(Change Buffer)

The change buffer is a special data structure that caches changes to secondary index pages when those pages are not in the buffer pool. The buffered changes, which may result from INSERT, UPDATE, or DELETE operations (DML), are merged later when the pages are loaded into the buffer pool by other read operations.

  • 写缓存(Change Buffer) 是一种特殊的数据结构,用于在对数据变更时,如果数据所在的数据页没有在 buffer pool 中的话,在不影响数据一致性的前提下,InnoDB 引擎会将对数据的操作缓存在 Change Buffer 中,这样就省去了从磁盘中读入这个数据页1
  • 将数据页从磁盘读入内存中涉及随机 IO 访问,这也是数据库里面成本最高的操作之一,而利用写缓存(Change Buffer)可以减少 IO 操作,从而提升数据库性能。
  • INSERT、UPDATE 或 DELETE 操作 (DML) 会导致的缓冲变更

在这里插入图片描述

3. 自适应哈希索引

根据用户经常查询的数据,建立起来的一个hash 索引2

  • Adaptive Hash实际上是在在运行期依据实际的数据查询情况动态产生的,它产生后存放在内存中,以便充分利用内存的随机IO优势
  • Adaptive Hash只保存这张表的热点查询数据,不是对整个BTREE索引或者数据进行全部缓存,这样太费内存而且不现实
  • Adaptive Hash的保存在内存中的设计决定的它缓存的数据总量有限,如果你的机器内存足够,那么使用innodb_adaptive_hash_index打开Adaptive Hash并分配内存到合适的大小会有性能收益.
  • 如果MySQL服务重启或者崩溃,那么Adaptive Hash在MySQL服务重新正常工作后需要重新动态的创建,以前的热点数据会消失.
  • Adaptive Hash实际上是对BTREE索引做缓存优化,加速单值等 值查询。为了节约内存,可以对BTREE索引的部分索引内容做HASH而不是非得要做全部内容的HASH.

4. 日志缓冲区

The log buffer is the memory area that holds data to be written to the log files on disk. Log buffer size is defined by the innodb_log_buffer_size variable. The default size is 16MB. The contents of the log buffer are periodically flushed to disk. A large log buffer enables large transactions to run without the need to write redo log data to disk before the transactions commit. Thus, if you have transactions that update, insert, or delete many rows, increasing the size of the log buffer saves disk I/O.

The innodb_flush_log_at_trx_commit variable controls how the contents of the log buffer are written and flushed to disk. The innodb_flush_log_at_timeout variable controls log flushing frequency.

日志缓冲区是一块内存区域,保存着将被写入磁盘日志文件的数据。
日志缓冲区的内容定期刷新到磁盘。较大的日志缓冲区可以运行大型事务,而无需在事务提交之前将重做日志数据写入磁盘。因此,如果有更新,插入或删除许多行的事务,则增加日志缓冲区的大小可以节省磁盘I/O3

innodb_flush_log_at_trx_commit :控制如何将日志缓冲区的内容写入并刷新到磁盘。

innodb_flush_log_at_timeout :控制日志刷新频率。

【关于磁盘架构,正在编写】


  1. https://www.cnblogs.com/jamaler/p/12371205.html ↩︎

  2. 參考:https://segmentfault.com/a/1190000038592443 ↩︎

  3. 原文链接:https://blog.csdn.net/u010647035/article/details/104733939 ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值