1.数据区
就是描述信息+缓存页这块,用来存放从磁盘加载的数据页(看上图 索引页和数据页是分开的)
2. free链表
用来标识数据区哪些数据页是可用的
3. flush链表
update的时候,如果数据在数据区可以找到,那就直接内存更新,后续通过异步线程将数据刷回磁盘
4. lru链表
● 既然用的是Buffer pool缓存,那就肯定有满的一天,所以需要使用lru链表来进行清理
● 另外,既然是缓存,那我肯定是想提高缓存的命中率的,mysql存在预读机制、全表扫描,这些会影响缓存的命中率,因为预读导致加载了很多没用的数据,全表扫描更可怕,直接填充大量无用数据
解决办法:冷热分区,优先分配到冷数据区,如果读取次数很频繁,就把他加载到热数据区。lru在清理的时候,优先清理冷数据区,热数据区访问频繁,提高的缓存的命中率。
解决办法:冷热分区,优先分配到冷数据区,如果读取次数很频繁,就把他加载到热数据区。lru在清理的时候,优先清理冷数据区,热数据区访问频繁,提高的缓存的命中率。
5. insert buffer(5.6之前针对 insert做的优化, 5.7改名为change buffer 对dml操作都会优化)
update执行一条语句的时候,假设buffer pool中没有数据,它就会去磁盘加载,这时候mysql的设计者又加了一种数据结构 insert buffer,就是说我先把 update要操作数据记录到insert buffer中,不去访问磁盘了,后续异步线程merge到磁盘 或者select的时候 merge到磁盘