MySQL存储引擎的深入介绍
本周很高兴邀请到JunZhi给我们带来MySQL存储引擎的深入介绍,相关内容总结如下:
Slides
- JunZhi使用的Slides。
- MySQL系列讲座第一讲总结:MySQL DB 引擎的演化和对比 && MySQL Query和Schema Migration的介绍
- MySQL系列讲座第二讲总结:MySQL存储引擎的深入介绍
- MySQL系列讲座第三讲总结:MySQL的事务介绍
- MySQL系列讲座第四讲总结:MySQL锁的介绍 && MySQL主从一致,高可用以及如何实现数据不丢失
- MySQL系列讲座第五讲总结:MySQL主从一致 && MySQL读写分离实操
- MySQL系列讲座第六讲总结:Distributed MySQL
- 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-刷脏,更多的源码阅读。
扩展知识
- postgresql之vacuum, postgresql的vacuum介绍。
- 数据库中常说的steal和force到底是什么
- MySQL中lock和Latch的介绍。
- 我们上次MySQL的讨论总结。
再次感谢大家的参与,也希望大家有好的资源能联系我更新这篇文章。谢谢大家。
下周话题安排和往期话题回顾敬请参见《系统设计开荒小分队话题讨论简介》
7 Responses
[…] MySQL系列讲座第二讲总结:MySQL存储引擎的深入介绍 […]
[…] MySQL系列讲座第二讲总结:MySQL存储引擎的深入介绍 […]
[…] MySQL系列讲座第二讲总结:MySQL存储引擎的深入介绍 […]
[…] MySQL系列讲座第二讲总结:MySQL存储引擎的深入介绍 […]
[…] MySQL系列讲座第二讲总结:MySQL存储引擎的深入介绍 […]
[…] MySQL系列讲座第二讲总结:MySQL存储引擎的深入介绍 […]
[…] MySQL系列讲座第二讲总结:MySQL存储引擎的深入介绍 […]