欢迎关注公众号:月伴飞鱼,每天分享程序员职场经验!
文章内容收录到个人网站,方便阅读:hardyfish.top/
资料分享
MySQL排错指南:
- 资料链接:url81.ctfile.com/f/57345181-…
- 访问密码:3899
MySQL性能调优与架构设计:
- 资料链接:url81.ctfile.com/f/57345181-…
- 访问密码:3899
基本概念
Buffer Pool 是一片
连续的内存空间,通过innodb_buffer_pool_size在服务器运行过程中调整buffer pool大小,默认为128MB。
Free Page(空闲页),此页未被使用,位于Free 链表。
Clean Page(干净页),此页已被使用,但是页面未发生修改,位于LRU 链表。
Dirty Page(脏页),表示此页已被使用且已经被修改,其数据和磁盘上的数据已经不一致。
当脏页上的数据写入磁盘后,内存数据和磁盘数据一致,那么该页就变成了干净页,脏页同时存在于LRU链表和Flush链表。
提高读性能:
读取数据的时候,先从
buffer pool LRU链表(干净页)读取数据。如果没有从磁盘读取并把它相邻的数据页一并加载进来。
提高写性能:
更新数据的时候,不需要每次都要写入磁盘,而是将 Buffer Pool 对应的缓存页标记为脏页,然后再由后台线程将脏页写入到磁盘。
数据页
磁盘文件被分成很多数据页,一个数据页里面有很多行数据。
一个数据页默认大小 16K。
更新一行数据,实际上是把行数据所在的
数据页整个加载到buffer pool中。
缓存页
buffer pool中存放的数据页我们叫缓存页,和磁盘上的数据页是一一对应的,都是16KB。
缓存页的数据,是从磁盘上加载到buffer pool当中的。
缓存页描述信息(描述信息块)
存的是 数据页所属的表空间号,数据页编号,数据页地址等信息。
放在缓存页的前面。
每个描述信息块大小是缓存页的5%左右,大约是
16*1024*0.05=800个字节。
基本结构
buffer pool初始化
数据库只要一启动,就会按照你设置的Buffer Pool大小。
稍微再加大一点,去找操作系统申请一块内存区域,作为Buffer Pool的内存区域。
然后当内存区域申请完毕之后,数据库就会按照默认的缓存页的16KB的大小以及对应的800个字节左右的描述数据的大小。
在Buffer Pool中划分出来一个一个的缓存页和一个一个的他们对应的描述数据。
管理空闲页
当需要从磁盘中加载一个页到 Buffer Pool 中时。
通过
Free链表,取一个空闲的缓存页,并且填写该缓存页对应的控制块的信息,然后把该缓存页对应的控制块从Free 链表中移除。
管理脏页
在需要刷盘时,使用
Flush链表,后台线程就可以遍历脏页,写入到磁盘。