Mysql底层原理二:Buffer Pool

在这里插入图片描述
在这里插入图片描述

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到磁盘

相关推荐

  1. MySQL底层原理

    2024-04-08 12:58:02       34 阅读
  2. Mysql底层原理一:事务

    2024-04-08 12:58:02       40 阅读
  3. Mysql事务隔离级别及其底层原理

    2024-04-08 12:58:02       66 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-08 12:58:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-08 12:58:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-08 12:58:02       87 阅读
  4. Python语言-面向对象

    2024-04-08 12:58:02       96 阅读

热门阅读

  1. windows 环境下docker打包python项目

    2024-04-08 12:58:02       41 阅读
  2. 基于单片机的风向风速传感器防冻装置设计

    2024-04-08 12:58:02       35 阅读
  3. 网络入门基础

    2024-04-08 12:58:02       30 阅读
  4. ISBN信息查询api接口

    2024-04-08 12:58:02       40 阅读
  5. 【云开发笔记NO.25】缓存和技术中台

    2024-04-08 12:58:02       31 阅读
  6. SpringBoot 使用redis

    2024-04-08 12:58:02       32 阅读
  7. 这个开源项目,支持中文版啦~

    2024-04-08 12:58:02       33 阅读
  8. SSL根证书是什么

    2024-04-08 12:58:02       40 阅读
  9. Vue3_2024_10天【Vue2和Vue3父传子,使用props的区别】

    2024-04-08 12:58:02       39 阅读
  10. ThreadLocal该何时注入值?

    2024-04-08 12:58:02       34 阅读