浅谈 MySQL InnoDB 的内存组件

前言

MySQL中执行一条SQL语句,相应表数据的读写都是由存储引擎去做(更新数据、查询数据)。

在这个过程,存储引擎需要决策一些事情

  • 数据是从内存查还是从硬盘查

  • 数据是更新在内存,还是硬盘

  • 内存的数据什么时候同步到硬盘

所以存储引擎会按照内部逻辑与内存、硬盘交互。

我们可以按需选择存储引擎,比如常见的 InnoDB、MyISAM、Memory 等等。

众多存储引擎中,InnoDB是最为常用的,从 MySQL5.5.8 版本开始,InnoDB是默认的存储引擎。

InnoDB简介

InnoDB存储引擎支持事务,其设计目标主要面向在线事务处理(OLTP)的应用。

特点是行锁设计、支持MVCC、外键,提供一致性非锁定读,同时本身设计能够最有效的利用内存和CPU,是 MySQL 最常用的存储引擎。

InnoDB的重要内存结构

InnoDB存储引擎在内存中有两个非常重要的组件,分别是缓冲池(Buffer Pool)和重做日志缓存(redo log buffer)。

Buffer Pool简介

缓冲池(Buffer Pool)里面会缓存很多的数据,比如数据页、索引页、锁信息等等。

MySQL表数据是以页为单位,你查询一条记录,会从硬盘把一页的数据加载出来,加载出来的数据叫数据页,会放入到 Buffer Pool 中。

后续的查询先从 Buffer Pool 中找,没有命中再去硬盘加载,减少硬盘 IO 开销,提升性能。

更新表数据的时,如果 Buffer Pool 里命中数据,就直接在 Buffer Pool 里更新。

总之 Buffer Pool 会缓存很多的数据,以便后续的查询与更新。

小贴士:这里只是用数据页举例帮助大家理解,大家千万不要认为 Buffer Pool 里面只有数据页,它只是占 Buffer Pool 大部分空间,关于 Buffer Pool 更多细节,后续会有专门的文章讲解。

redo log buffer简介

接着思考一个问题,假设我们把 Buffer Pool 中某个数据页的某条数据修改了,但是硬盘的数据还未同步,此时数据是不一致的,如果 MySQL 宕机了,数据就丢失了。

这可怎么办呢。

为了保证数据的持久性,InnoDB存储引擎加入了 redo 日志功能,也叫重做日志。

每当我们对表数据进行更新时,会把"在某个数据页上做了什么修改"记录到重做日志缓存(redo log buffer)里。

当事务提交时,会把 redo log buffer 清空,刷盘到 redo 日志文件。

这样 MySQL 宕机了也没关系,因为重启后会根据 redo 日志去恢复数据。

小贴士:redo日志细节也很多,本文只做个介绍,后续会有专门的文章讲解。

小结

其实不难发现,缓冲池(Buffer Pool)和重做日志缓存(redo log buffer),它们都是为了减少硬盘 IO 开销。

因为 Buffer Poolredo 日志涉及内容较多,后面会出两篇文章单独讲。

今天讲的这些内容全是在给后面的文章做铺垫,大家先知道它们是干嘛的,留个印象就行了。

相关推荐
JavaPub-rodert3 分钟前
我把 OpenAI 协议塞进了 Go 工具库:go-commons 开始支持 AI 了
开发语言·人工智能·golang
caimouse3 分钟前
ReactOS 图形系统分析(23):引擎内存管理 — mem.c
c语言·开发语言
caimouse4 分钟前
ReactOS 图形系统分析(15):窗口对象 — EWNDOBJ(engwindow.c)
c语言·开发语言
青 春 记 忆7 分钟前
零基础入门python07:让程序记住数据——JSON文件和异常处理
开发语言·windows·python·json·python3.11
weixin_431600448 分钟前
NestJS 入门(9):连上数据库,SQL 写在哪?
数据库·后端·sql·学习·nest.js
Java成神之路-20 分钟前
Spring AI Alibaba 实现多轮对话记忆:ChatMemory 与 Redis 持久化实战
java·springaialibaba
qq_225891746622 分钟前
基于Flask的城市地铁客流量数据预测系统设计与实现
后端·python·flask
JAVA面经实录91723 分钟前
网络编程基础(Java Web/分布式前置·完整版)(十一)
java·前端·网络
IT_陈寒24 分钟前
搞不定JavaScript的数组去重?你可能漏了这两个坑
前端·人工智能·后端
W_3260029 分钟前
Python 常用标准 / 第三方库:random、tqdm、turtle、jieba 用法
开发语言·python