咱们晓得MySql数据是存在磁盘的,也从上一篇文章晓得他是怎么读取磁盘文件的数据。那咱们通过select查问数据的时候,就会从磁盘读到MySql,而后返回给客户端。
咱们能够试想一下,假如有个热数据,咱们每秒须要查10次,依照下面的流程,就要查10次磁盘,只管有索引的存在,那效率也是很低的,所以MySql有一个缓冲池Buffer Pool,把每次查问的数据寄存在Buffer Pool里,前面如果再查这个数据,就间接从Buffer Pool里取,就防止了每次从磁盘查找,性能就有了很大的晋升。
在磁盘中,咱们每次查问的时候,会定位到数据页,而后二分查找某一行,在Buffer Pool中,他也是相似的,所以咱们查找到某一条数据的时候,他就会把这个数据所在的数据页加载到Buffer Pool。
把数据页的信息加载到Buffer Pool时,咱们称之为缓存页,他也是16kb,另外每个缓存页还对应着形容数据,这些形容数据包含缓存页的信息(比方地址)、数据页的信息等。咱们假如Buffer Pool的大小是160kb,那他就有10个缓存页和10个形容数据,所以Buffer Pool理论大小会超过160kb。
当从磁盘读取一个数据页的时候,咱们须要晓得把他放在哪个缓存页里,也须要晓得缓存页的地址,这些信息是存在形容数据里的,所以MySql保护了一个双向链表数据结构的free链表,当还没有加载数据页的时候,他的构造是这样的(这里形容数据就画了6个,以及疏忽了形容数据到缓存页的指向):
当咱们加载一个数据页的时候,会先从free链表判断是否还有形容数据,如果有,阐明缓存页还没有满,那就把数据页的信息加载到缓存页中。同时把这个形容信息从free链表中移除,而后退出到双向链表数据结构的LRU链表。LRU链表就是会把最新拜访的挪动到头部去。
如果没有,阐明缓存页都有数据了。下面的LRU链表作用就在这里体现了,既然缓存页都满了,那必定会淘汰已有的缓存页给新的缓存页,LRU链表就是把链表最初面的,也就是起码拜访的形容数据对应的缓存页的数据刷入磁盘,而后把这个缓存页给新的数据页。
发表回复