Mysql数据库缓冲池详解(Buffer pool)

 更新时间:2024年12月25日 10:11:49   作者:明矾java  
InnoDB存储引擎通过BufferPool缓存数据页和索引页,减少磁盘I/O,提升查询性能,BufferPool通过预读和checkpoint机制优化I/O操作和数据持久化

Buffer pool的作用

InnoDB 存储引擎是以页为单位来管理存储空间的,我们进行的增删改查操作其实本质上都是在访问页面(包括读页面、写页面、创建新页面等操作)。

而磁盘 I/O 需要消耗的时间很多,而在内存中进行操作,效率则会高很多,为了能让数据表或者索引中的数据随时被我们所用,DBMS 会申请占用内存来作为数据缓冲池 ,在真正访问页面之前,需要把在磁盘上的页缓存到内存中的 Buffer Pool 之后才可以访问。

这样做的好处是可以让磁盘活动最小化,从而 减少与磁盘直接进行 I/O 的时间。

要知道,这种策略对提升 SQL 语句的查询性能来说至关重要

如果索引的数据在缓冲池里,那么访问的成本就会降低很多。

即申请一块内存提前从磁盘中读取数据到内存,后续mysql访问数据都从Buffer pool 这个缓冲池里访问,减少了磁盘IO的次数,提高查询效率。

缓冲池(Buffer Pool)

在 InnoDB 存储引擎中有一部分数据会放到内存中,缓冲池则占了这部分内存的大部分,它用来存储各种数据的缓存,由下图可以看到 InnoDB 缓冲池包括了数据页、索引页、插入缓冲、锁信息、自适应 Hash 和数据字典信息等。

缓存原则

位置 * 频次”这个原则,可以帮我们对 I/O 访问效率进行优化。

首先,位置决定效率,提供缓冲池就是为了在内存中可以直接访问数据。

其次,频次决定优先级顺序。因为缓冲池的大小是有限的,比如磁盘有 200G,但是内存只有 16G,缓冲池大小只有 1G,就无法将所有数据都加载到缓冲池里,这时就涉及到优先级顺序,会优先对使用频次高的热数据进行加载。

缓冲池的预读特性

缓冲池的作用就是提升 I/O 效率,而我们进行读取数据的时候存在一个“局部性原理”,也就是说我们使用了一些数据,大概率还会使用它周围的一些数据,因此采用“预读”的机制提前加载,可以减少未来可能的磁盘 I/O 操作。

缓冲池如何读取数据

缓冲池管理器会尽量将经常使用的数据保存起来,在数据库进行页面读操作的时候,首先会判断该页面 是否在缓冲池中,如果存在就直接读取,如果不存在,就会通过内存或磁盘将页面存放到缓冲池中再进行读取。

缓存在数据库中的结构和作用如下图所示:

mysql通过存储引擎读取到缓冲池,再从缓冲池读取数据,缓冲池就是媒介。

如果我们执行 SQL 语句的时候更新了缓存池中的数据,那么这些数据会马上同步到磁盘上吗?

实际上,当我们对数据库中的记录进行修改的时候,首先会修改缓冲池中页里面的记录信息,然后数据库会以一定的频率刷新到磁盘中。注意并不是每次发生更新操作,都会立即进行磁盘回写。

缓冲池会采用一种叫做checkpoint的机制 将数据回写到磁盘上,这样做的好处就是提升了数据库的整体性能。

比如,当缓冲池不够用时,需要释放掉一些不常用的页,此时就可以强行采用checkpoint的方式,将不常用的脏页回写到磁盘上,然后再从缓存池中将这些页释放掉。

这里的脏页 (dirty page) 指的是缓冲池中被修改过的页,与磁盘上的数据页不一致。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MySQL绿色版设置编码以及1067错误详解

    MySQL绿色版设置编码以及1067错误详解

    这篇文章主要介绍了MySQL绿色版设置编码,以及1067错误的相关资料,需要的朋友可以参考下
    2017-05-05
  • mysql split函数用逗号分隔的实现

    mysql split函数用逗号分隔的实现

    这篇文章主要介绍了mysql split函数用逗号分隔的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • mysql中like % %模糊查询的实现

    mysql中like % %模糊查询的实现

    这篇文章主要介绍了mysql中like % %模糊查询的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Mysql实现增量恢复的方法详解

    Mysql实现增量恢复的方法详解

    本文给大家分享的是如何实现mysql增量恢复的场景以及具体实现方法,有需要的小伙伴可以参考下
    2018-07-07
  • MySQL中怎么匹配年月

    MySQL中怎么匹配年月

    一般数据库中给到的时间都是年-月-日形式的,那怎么匹配年-月/的形式呢,下面通过实例代码介绍怎么在数据库中查询到关于2021年8月的数据,对mysql匹配年月相关知识,感兴趣的朋友跟随小编一起看看吧
    2024-04-04
  • MySQL日期格式以及日期函数举例详解

    MySQL日期格式以及日期函数举例详解

    这篇文章主要给大家介绍了关于MySQL日期格式及日期函数的相关资料,日期在数据库中是一个常见且重要的数据类型,在MySQL中我们可以使用各种函数和格式化选项来处理和显示日期,需要的朋友可以参考下
    2023-11-11
  • JDBC-idea导入mysql连接java的jar包(mac)的方法

    JDBC-idea导入mysql连接java的jar包(mac)的方法

    这篇文章主要介绍了JDBC-idea导入mysql连接java的jar包(mac)的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • MySQL免安装版(zip)安装配置详细教程

    MySQL免安装版(zip)安装配置详细教程

    这篇文章主要为大家详细介绍了MySQL免安装版(zip)安装配置详细教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • MySQL5.7不停业务将传统复制变更为GTID复制的实例

    MySQL5.7不停业务将传统复制变更为GTID复制的实例

    下面小编就为大家带来一篇MySQL5.7不停业务将传统复制变更为GTID复制的实例。小编觉的挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • MySQL 中这么多索引该怎么选择

    MySQL 中这么多索引该怎么选择

    这篇文章主要介绍了MySQL 中这么多索引该怎么选择,索引的本质是存储引擎用于快速查询记录的一种数据结构。特别是数据表中数据特别多的时候,索引对于数据库的性能就愈发重要,下文详细相关内容介绍,需要的小伙伴可以参考一下
    2022-09-09

最新评论