首页 > 数据库 > > openfile解读以及和latch的一点关系
最初启动 MySQL 服务器的时候,需要完成对 Buffer Pool 的初始化过程,就是分配 Buffer Pool 的内存空间,把它划分成若干对控制块和缓存页。但是此时并没有真实的磁盘页被缓存到 Buffer Pool 中(因为还没有用到),之后随着程序的运行,会不断的有磁盘上的页被缓存到 Buffer Pool 中 .
举例:
show status like 'open%_table%';
注意会话 opened 开头的都是当前会话的。
再开一个窗口
Opened 的是 ,而 open 的不受影响。 Open 的是全局的。
回过来
一旦执行 flush tables 那么内存的就被刷掉了。 Open 的全局的没有了。
被打开的就是被缓存了。为什么要缓存。因为要快啊!缓存的快,每次从磁盘访问表结构和一些刚被读过的,这样就慢。
但是数据库要知道哪些表和数据被缓存了。以防止增加了不知道 flush 了也不知道。所以我们最好在某个地方记录一下哪些页是可用的,我们可以把所有空闲的页包装成一个节点组成一个链表,这个链表也可以被称作 Free 链表(或者说空闲链表)。因为刚刚完成初始化的 Buffer Pool 中所有的缓存页都是空闲的,所以每一个缓存页都会被加入到 Free 链表中有了这个 Free 链表事儿就好办了,每当需要从磁盘中加载一个页到 Buffer Pool 中时,就从 Free 链表中取一个空闲的缓存页,并且把该缓存页对应的控制块的信息填上,然后把该缓存页对应的 Free 链表节点从链表中移除,表示该缓存页已经被使用了。
那么如果频繁更新 free 链表会如何?
答案只有一个,等啊。
那一次等待一次爽,一直等待一直爽。
一直到 10-15 分钟左右。数据库估算都 10 几分钟大家都堵在这里等待什么都做不了了。那再等下去也没有结果。
好吧重启实例。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/637517/viewspace-3170077/ ,如需转载,请注明出处,否则将追究法律责任。