buffer pool 是什么?
一块内存:默认128M,用于缓存数据的缓冲区
- 作用:
提高查询性能
,因为是第一次查找是一页(16kb)的数据从磁盘加载入缓冲区,如果第二次查找的数据也在这页内容里,那么第二次就会直接从buffer pool 里面查询, 提高了查询效率
数据页
- 磁盘文件分为很多数据页,一个数据页有很多行数据
- 数据页默认大小16kb
缓存页
- buffer pool中存放的数据页叫缓存页,和磁盘数据页对应,都是16kb
- 缓存页的数据是从磁盘加载到buffer pool中的
LRU链表
记录使用缓冲页频率(当buffer pool满存后,用于判断哪些适合淘汰刷新
- 只要从磁盘中加载数据页到缓存页,就会把这个缓存页的描述数据块放到LRU链表的头部,那么,只要缓存页有数据,他都会在LRU里,而且最近被加载数据的缓存页都会被放到LRU链表的头部,假设某个缓存页的描述数据块在LRU链表的表尾,后续只要查询或者修改了这个缓存页的数据,就会把这个缓存页的描述数据块移动到LRU链表的头部。即是说,只要最近被访问过的缓存页一定是在LRU链表的头部。
- LRU链表分为热数据区和冷数据区,冷数据区占了总链表的37%
- 冷数据区是不常访问的缓存页
- 热数据区是经常访问的缓存页
- 数据页加载到缓存页后,在1s之后,访问该缓存页,该缓存页会被移动到热数据区头部
- 数据页刚加载到缓存页后,在1s之内,访问该缓存页,该缓存页是不会被移动到热数据区头部的(防止全表扫描速度快,误判)
free链表
表示哪里有空闲页的链表
注:buffer pool满存后会如何处理?
- 淘汰机制:将buffer pool中不常用的那页数据淘汰掉 即LRU链表的尾部,但是淘汰是无序淘汰的,你不知道buffer pool中哪里是空闲哪里是不空闲的
这时free链表的作用就体现出来了
free链表的结构:
- 基节点:
– 存放链表总长个数
– 存放头节点
– 存放尾节点 - 控制块:
–指向对应的缓冲区内每页地址,表示该页空闲,若有新的空白页则加入到链表尾部
flush链表
-
实际上要更新的数据页都会在Buffer Pool的缓存页里,直接在内存中执行增删改的操作。更新完成后缓存页里面的数据就修改了,但是磁盘里面数据还没有变啊。那么此时缓存页里的数据和磁盘上的数据页里的数据,就出现了不一致,于是我们便说这个缓存页里的数据成为了脏数据,这个缓存页也变成了脏页。
-
这个flush链表本质也是通过缓存页的描述数据块中的两个指针,让被修改过的缓存页的描述数据块,组成一个双向链表。
-
凡是被修改过的缓存页,也就是我们所说的脏页,都会把他的描述数据块加入到flush链表中去,这些脏页呢后续都是要flush刷新到磁盘上去的,所以flush链表的结构跟free链表几乎是一样的。
-
脏页刷新参数
当mysql进行脏页刷盘的时候可能会刷新临接数据页:意思是当MySQL将某脏页刷新回磁盘时,是否也以相同的态度将该脏页邻接的脏页一并刷新回磁盘。可以通过参数innodb_flush_neighbors控制该过程。
设置为0时表示,禁用刷新邻接的功能。
设置为1时表示,以相同的态度刷新其邻接的脏页。
设置为2时表示,以相同的程度刷新脏页。