mysql的缓存
每次访问一个页的记录需要把整个页加载进一个叫bufferpool的内存区中,即使访问结束页还处于bufferpool中,再次访问该页可以直接从内存中读。
用哈希表来判断页到底缓存了还是没有缓存(用表空间号和页号作为key)
页存入bufferpool中涉及到三个特殊的链表:
1、free链表:可用的内存块。
2、flush链表:如果修改了某个内存中的页使数据与磁盘不一致了这个页称为脏页,脏页组成flush链表,有专门的线程负责刷新脏页到链表。
3、特殊的LRU链表,用来完成缓存功能,mysql还做了许多其他的优化,将LRU表分为young区和old区,访问间隔短不会将其移动到young区,这都是为了防止预读和全表查询刷新LRU链表,只有页处于young区的后1/4时才能被移动等优化手段。