关于 InnoDB 存储引擎的一些总结!

先说 3 件事吧!

  1. 春节放假期间公众号不发文。提前祝大家新年快乐!
  2. 公众号后面可能会改名,有好的名字,可以留言推荐!
  3. 最近喜获信息系统高级工程师的证书!谢谢朋友圈几百个粉丝的祝福,这个比 PMP 难考,一年可以考两次。我是死看书,没啥诀窍。没毕业也可以考,有没有用,看公司,看个人!

时间过的很快,一眨眼一年时间就过去了。过去一年里,我也和群里的不少朋友一起成长,互相学习到不少东西!下面总结一些,我们经常在群里讨论的一些关于 MySQL 的知识点。

1、InnoDB 中每一页的大小默认为 16kb,但是其也支持压缩页的功能,即将原本 16kb 的页压缩为 1kb、2kb、4kb 和 8kb。当需要从缓存池中申请 4kb 大小的页时,MySQL 的申请步骤如下:

  • 检查 4kb 的 unzip_LRU 列表,检查是否有可用的空闲页;
  • 若有,则直接使用;
  • 否则,检查 8kb 的 unzip_LRU 列表;
  • 若能够得到空闲页,则分解为 2 个 4kb 的页,并且存放到 4kb 的 unzip_LRU 列表;
  • 若不能得到空闲页,就从 LRU 列表中申请一个 16kb 的页,将其分解为 1个 8kb 和 2 个 4kb 的页,并且存放到对应的 unzip_LRU 列表中

2、当 LRU 列表中的页被修改之后,其数据就和磁盘上的数据产生了不一致,这种页被称为脏页,此时数据库会根据 checkpoint 机制将脏页刷新到磁盘中,脏页不仅存在于 LRU 列表中,也存在于 FLUSH 列表中,FLUSH 列表中的数据是专门用来管理将数据刷新到磁盘中的。

3、在下列三种情况下重做日志会将重做日志缓冲中的内容刷新到重做日志文件中:

  • master thread 每一秒将重做日志缓冲刷新到重做日志文件;
  • 每个事务提交时会将重做日志缓冲刷新到重做日志文件;
  • 当重做日志缓冲池剩余空间小于1/2时,重做日志缓冲刷新到重做日志文件。

4、为了避免数据丢失的问题,事务数据库都采用了 write ahead log 机制,也就是当事务提交时,存储引擎先将数据写入到重做日志中,然后再修改页中的数据,当数据库发生宕机时,可以通过重做日志来恢复数据。

5、为了协调 CPU 的处理速度与磁盘的读写速度之间的不匹配问题,MySQL 采用了缓冲池来解决这个问题,当发生数据读写时,其都是先将数据写入到缓冲池中,然后通过 checkpoint 技术将数据写入到磁盘中。

6、checkpoint 技术所解决的问题:

  • 缩短数据库的恢复时间;
  • 缓冲池不够用时,将脏页刷新到磁盘;
  • 重做日志不可用时,刷新脏页。

7、公众号里之前也总结了不少关于 MySQL 的面试题和知识点。如:

搜了一下,大概有 50 多篇原创 MySQL 文章,都可以在历史文章里搜索到。我依然推荐大家可以看看《高性能 MySQL》、丁奇大神的《MySQL实战45讲》。

另外我的小程序里也有一些 MySQL 相关的知识点,虽然很久没更新了!

由于今天临时有事,这篇文章更新的很晚,很抱歉!最后祝大家鼠年有——

“鼠”不尽的快乐!“鼠”不尽的收获!

“鼠”不尽的钞票!“鼠”不尽的笑容!

“鼠”不尽的幸福,“鼠”不尽的幸运!

“鼠”不尽的甜蜜,“鼠”不尽的活力!

2020,“鼠”你最胖!不是,“鼠”你最棒!