MySQL存储引擎的深入介绍

本周很高兴邀请到JunZhi给我们带来MySQL存储引擎的深入介绍,相关内容总结如下:

Slides

  1. JunZhi使用的Slides
  2. MySQL系列讲座第一讲总结:MySQL DB 引擎的演化和对比 && MySQL Query和Schema Migration的介绍
  3. MySQL系列讲座第二讲总结:MySQL存储引擎的深入介绍
  4. MySQL系列讲座第三讲总结:MySQL的事务介绍
  5. MySQL系列讲座第四讲总结:MySQL锁的介绍 && MySQL主从一致,高可用以及如何实现数据不丢失
  6. MySQL系列讲座第五讲总结:MySQL主从一致 && MySQL读写分离实操
  7. MySQL系列讲座第六讲总结:Distributed MySQL
  8. MySQL系列讲座第七讲总结:Uber是如何选择在Postgres和MySQL之间切换的

Q&A

感谢张程整理的笔记和Nancy提供的参考笔记。

操作系统的Page和MySQL的page有何不同?

“MySQL中的page是数据逻辑存储形式。并不是操作系统中内存结构中说的page。二者没有什么关系。数据存储在磁盘上最小单位是block,都是以block读取到内存中。MySQL存储引擎使用page这种存储形式,一个page比如是16k,那么对于4k block的操作系统,就是4个块。这样每次读取按page(一次i/o )读取到内存。这样设计的好处是,降低i/o次数,将相关的block存储在page中管理,可以一次性读取很多块,提升处理速度。内存中的page是内存的管理单元,例如4k或者8k,大页2m等。物理块从磁盘读取,然后以页为单位在内存中进行管理。(内存中page结构,可以参考《操作系统》,一般计算机专业都开有这个课程)”

【扩展】一文理解 MySQL 中的 page 页, Junzhi的一张图也是引用这篇文章的。

【扩展】mysql中InnoDB引擎中页的概念,很详细介绍了InnoDB中页的概念。

【扩展】深入理解操作系统之——分页式存储管理,操作系统中页的介绍。

【扩展】MySQL的Page和操作系统中的Page有什么区别?知乎上关于这个问题的讨论。

MySQL是如何对LRU进行优化处理的?

“当从磁盘读取数据页后,会先将数据页存放到 LRU 链表冷数据区的头部,如果这些缓存页在 1 秒之后被访问,那么就将缓存页移动到热数据区的头部;如果是 1 秒之内被访问,则不会移动,缓存页仍然处于冷数据区中。1 秒这个数值,是由参数 innodb_old_blocks_time 控制。”

“当一个缓存页处于热数据区域的时候,我们去访问这个缓存页,这个时候我们真的有必要把它移动到热点数据区域的头部吗?从代码的角度来看,将链表中的数据移动到头部,实际上就是修改元素的指针指向,这个操作是非常快的。但是为了安全起见,在修改链表的时候,我们需要对链表加上锁,否则容易出现并发问题。当并发量大的时候,因为要加锁,会存在锁竞争,每次移动显然效率就会下降。因此 MySQL 针对这一点又做了优化,如果一个缓存页处于热数据区域,且在热数据区域的前 1/4 区域(注意是热数据区域的 1/4,不是整个链表的 1/4),那么当访问这个缓存页的时候,就不用把它移动到热数据区域的头部;如果缓存页处于热数据的后 3/4 区域,那么当访问这个缓存页的时候,会把它移动到热数据区域的头部。”

【扩展】MySQL是如何对LRU算法进行优化的?又该如何对MySQL进行调优?,很不错的介绍这一块优化的文章。

【扩展】MySQL学习篇(9)——MySQL对LRU的优化,这个系列的文章还是不错的,值得一看。

【扩展】LRU算法介绍、优化、使用场景(Redis、MySQL、Memcached), 从纯算法的角度进行了介绍。

【扩展】MYSQL实战优化——buffer pool生产经验,尝试从使用经验上来说明几个问题。

【补充】在第三讲我们补充了一个问题:在LRU淘汰过程中,如果有过热数据,是否会重复发生move(insert)到头部的操作?不会。只有当当前的freed_page_clock – 上次移动的freed_page_clock > 1/4 of LRU_new length 才会移动。这样的话,既可以保障该页不会被evict到硬盘中,又可以保证减少内存操作次数,提高效率。

如何理解MySQL的flush page操作

【扩展】理解 InnoDB 自适应刷脏,源码级进行了详细分析。

【扩展】MySQL学习之flush(刷脏页),很不错的介绍。

【扩展】MySQL-Innodb-刷脏,更多的源码阅读。

扩展知识

  1. postgresql之vacuum, postgresql的vacuum介绍。
  2. 数据库中常说的steal和force到底是什么
  3. MySQL中lock和Latch的介绍。
  4. 我们上次MySQL的讨论总结

再次感谢大家的参与,也希望大家有好的资源能联系我更新这篇文章。谢谢大家。

下周话题安排和往期话题回顾敬请参见《系统设计开荒小分队话题讨论简介

You may also like...

7 Responses

  1. February 20, 2022

    […] MySQL系列讲座第二讲总结:MySQL存储引擎的深入介绍 […]

  2. February 20, 2022

    […] MySQL系列讲座第二讲总结:MySQL存储引擎的深入介绍 […]

  3. March 1, 2022

    […] MySQL系列讲座第二讲总结:MySQL存储引擎的深入介绍 […]

  4. March 8, 2022

    […] MySQL系列讲座第二讲总结:MySQL存储引擎的深入介绍 […]

  5. March 16, 2022

    […] MySQL系列讲座第二讲总结:MySQL存储引擎的深入介绍 […]

  6. March 24, 2022

    […] MySQL系列讲座第二讲总结:MySQL存储引擎的深入介绍 […]

  7. April 5, 2022

    […] MySQL系列讲座第二讲总结:MySQL存储引擎的深入介绍 […]

Leave a Reply

Your email address will not be published.