广告
返回顶部
首页 > 资讯 > 数据库 >MySQL中的数据库缓冲池怎么管理
  • 564
分享到

MySQL中的数据库缓冲池怎么管理

mysql数据库 2023-02-13 15:02:05 564人浏览 安东尼
摘要

这篇文章主要介绍“Mysql中的数据库缓冲池怎么管理”,在日常操作中,相信很多人在mysql中的数据库缓冲池怎么管理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Mysql中

这篇文章主要介绍“Mysql中的数据库缓冲池怎么管理”,在日常操作中,相信很多人在mysql中的数据库缓冲池怎么管理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Mysql中的数据库缓冲池怎么管理”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

对于使用InnoDB存储引擎的表来说,是以页为单位来管理存储空间的,作为内存和磁盘之间换入换出的基本粒度。当我们将某页从磁盘中加载到内存中,会进行磁盘I/O。而磁盘I/O的开销非常影响整体性能,如果我们直接从内存中读取相应的页,那岂不是减少了磁盘I/O带来的性能损耗,效率则会提升很多。基于此,缓冲池(Buffer Pool 出现了,那么接下来,我们就来谈谈InnoDB中的Buffer Pool。

缓冲池(Buffer Pool)

有人会想,既然缓冲池这么好,那我们将所有数据都存储到缓冲池中不就好了,不不不,缓冲池是操作系统分配的一片连续的内存。而内存相比于磁盘的容量小得多,并且价格昂贵。那么操作系统会给缓冲池分配多少内存呢?

  • 默认情况下,缓冲池的大小为128MB;

当然,如果你的机器的内存容量非常大,可以在配置文件中配置启动选项参数innodb_buffer_pool_size单位是字节,最小不能小于5MB。

缓冲池的内部结构

缓冲池将操作系统分配的这一片连续的内存,划分成若干个大小默认为16KB的页(缓冲页)【此时还没有真正的磁盘页被缓存到Buffer Pool中】,当我们从磁盘中换入一个页到缓冲池中,如何分配位置呢?因此就需要一些控制信息来标识这些缓冲池中的缓冲页,这些控制信息都存放在一个叫控制块的内存区域中,与缓冲页一一对应。控制块的大小也是固定的。因此在这片连续的内存空间中,难免会产生内存碎片。综上,缓冲池的内部结构如下:

  • 缓冲页

  • 控制块:页号、缓冲页在缓冲池中的地址、链表节点信息等。

  • 内存碎片【若内存分配得当,内存碎片可有可无】

MySQL中的数据库缓冲池怎么管理

缓冲池的管理

上面在控制块中提到了链表节点信息,那么链表节点是用来做什么的呢?是为了更好的管理缓冲池中的页。而链表就是用来链接控制块的,因为控制块与缓冲页是一一对应的。

1)空闲链表

将所有空闲的缓冲页对应的控制块链接起来,形成的链表。

解决的问题:从磁盘中换入一个页到缓冲池中,如何区分缓冲池中的哪个页是空闲的呢?而有了空闲链表之后,换入一个磁盘页到缓冲池中时,就直接从空闲链表中获取一个空闲的缓冲页,并将磁盘页中对应的信息填到缓冲页对应的控制块中,然后将该控制块从空闲链表中删除即可。

2)更新链表

若修改了缓冲池中的缓冲页的数据,导致其与磁盘中数据不一致,该页称为脏页。将所有脏页对应的控制块链接起来形成更新链表,在将来的某个时间根据该链表将对应缓存页的数据刷新到磁盘中。

3)LRU链表

缓冲池的大小是有限的,如果缓存的页超出了缓冲池的大小,即没有空闲的缓冲页了,当有新的页要添加到缓冲池中时,采取LRU的策略将旧的缓冲页从缓冲池中移除,然后将新的页添加进来。由于LRU链表涉及的内容较多,我们接下来单独介绍。

LRU链表所蕴含的“哲理”

先提一下预读机制

在I/O上的优化机制,预读顾名思义,会异步地把某些页面加载到缓冲池中,预计很快就会需要这些页面,这些请求在一个范围内引入所有页面,就是所谓的 局部性原理,目的是减少磁盘I/O。

了解预读机制之前,先回顾一下InnoDB逻辑存储单元:表空间(tablespace)→段(segment )→区(extent)→页(page)。其中特意提一下区,后面会用到:一个区就是物理位置上连续的64个页,即一个区的大小是1MB.

MySQL中的数据库缓冲池怎么管理

预读机制可以细分为以下两种:

  • Linear read-ahead(线性预读):一种基于按顺序访问的缓冲池中的页面来预测可能很快需要哪些页面的技术。通过配置参数innodb_read_ahead_threshold,若顺序访问的某个区的页面超过这个参数的值,会触发异步读请求来读取下一个区中全部的页面到缓冲池中。

  • Random read-ahead(随机预读):可以根据缓冲池中已经存在的页面预测何时可能需要页面,而不管这些页面的读取顺序如何。如果在缓冲池中发现同一个区段的13个连续页面,InnoDB会异步发出一个请求来预取该区段的剩余页面。通过配置变量innodb_random_read_ahead来控制随机读的。

传统LRU对缓冲页是如何管理的呢?

利用LRU算法对最近最少使用的缓冲页进行管理,形成对应的链表,方便用于淘汰。

当访问一个页【即最近访问】

  • 该页在缓冲池中,将对应控制块移至LRU链表头部

  • 该页不在缓冲池中,淘汰尾部最近最少使用的页,从磁盘中加载进来该页并放在LRU链表头部

那么为什么InnoDB不使用这么直观的LRU算法呢?原因如下:

  1. 预读失效

    预读到缓冲池中的页都会放到LRU链表的头部,但其中很多页可能并不会被读取。

  2. 缓冲池污染

    很多使用频率较低的页加载到缓冲池中,会把使用频率较高的页从缓冲池中淘汰掉。比如全表扫描

优化后的LRU对缓冲页是如何管理的呢?

基于上述缺点,优化后的具体方法将传统LRU链表划分为两部分:热数据区域【年轻区】&冷数据区域【老年区】

  • 热数据区域【年轻区】:使用频率高的缓冲页

  • 冷数据区域【老年区】:使用频率低的区域

结构简图如下所示:

如图所示,热数据区域与冷数据区域分别占用不同比例,那么我们可以通过innodb_old_blocks_pct启动选项来控制冷数据区域所占比例。

MySQL中的数据库缓冲池怎么管理

改进后的LRU如何更好的解决预读失效问题呢?

  • 某个页在初次加载到缓冲池中时,先淘汰掉冷数据区域尾部的控制块(即其对应的页淘汰掉),然后新页对应的控制块会先放到冷数据区域的头部。

  • 若后续该页不被进行访问就会慢慢从冷数据区域中被淘汰掉,总体不会影响热数据区域访问频繁的缓冲页。

改进后的LRU如何更好的解决缓冲池污染问题呢?

先说结论,并没有很好的优化这个问题,原因如下【以全表扫描为例】:

  • 某个初次访问的页同样会放到冷数据区域的头部,但后续访问又会将其放到热数据区域的头部,这样同样会把访问频率较高的页给挤掉。

那么到底该如何解决缓冲池污染问题呢?

  • 缓冲池引入了冷数据区域时间窗口机制,即只有后续访问该页与第一访问该页的时间间隔大于规定的窗口值,就会将该页从冷数据区域移到热数据区域的头部。小于规定的窗口值,就不会进行移动操作。

  • 同样,窗口值可通过innodb_old_blocks_time参数【单位ms】来设置,默认1000ms,而1s会筛选掉大部分像全表扫描这样的操作。比如在一次全表扫描过程中,多次访问一个页面的时间间隔不会超过1s。

缓冲池VS查询缓存

缓冲池和查询缓存是一个东西吗?→不是

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

  • 查询缓存是提前把查询结果缓存起来,这样下次不需要执行就可以直接拿到结果。需要说明的是,在MySQL中的查询缓存,不是缓存查询计划,而是查询对应的结果。命中条件苛刻,而且只要数据表发生变化,查询缓存就会失效,因此命中率低。

到此,关于“MySQL中的数据库缓冲池怎么管理”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL中的数据库缓冲池怎么管理

本文链接: https://www.lsjlt.com/news/195838.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL中的数据库缓冲池怎么管理
    这篇文章主要介绍“MySQL中的数据库缓冲池怎么管理”,在日常操作中,相信很多人在MySQL中的数据库缓冲池怎么管理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL中...
    99+
    2023-02-13
    mysql 数据库
  • MySQL数据库缓冲池的使用情况
    本篇内容介绍了“MySQL数据库缓冲池的使用情况”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!如果你的数据...
    99+
    2022-10-18
  • MySQL数据库中如何查询缓冲机制
    MySQL数据库中如何查询缓冲机制,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。  MySQL数据库怎么查询缓冲机制  通过调节以下几个参数可...
    99+
    2022-10-18
  • Navicat 8.2.12中怎么管理mysql数据库
    本篇文章为大家展示了Navicat 8.2.12中怎么管理mysql数据库,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。用Navicat For MySql 将中的...
    99+
    2022-10-18
  • MYSQL数据库管理中怎么实现权限管理
    本篇文章为大家展示了MYSQL数据库管理中怎么实现权限管理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 MYSQL权限简介关于mysql的权限简单的理解就是m...
    99+
    2022-10-18
  • Mysql数据库怎么管理日志
    Mysql数据库怎么管理日志?针对这个问题,今天小编总结这篇有关日志管理的文章,可供感兴趣的小伙伴们参考借鉴,希望对大家有所帮助 一般成熟的软件,都会有自己的日志文件。通过这些日志来快速定位问题。...
    99+
    2022-10-18
  • Python中怎么创建mysql数据库连接池
    这篇文章给大家介绍Python中怎么创建mysql数据库连接池,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。安装为顶层模块 如果你打算在除了Webware之外的程序中使用,推荐安装为顶层模块:python s...
    99+
    2023-06-17
  • MySQL数据库中怎么查询缓存
    这期内容当中小编将会给大家带来有关MySQL数据库中怎么查询缓存,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、缓存条件,原理MySQL Query Cache是用来缓...
    99+
    2022-10-18
  • 怎么配置mysql数据库连接池
    配置mysql数据库连接池的方法在CATALINA_HOME/conf/server.xml中添加如下配置信息;<!--声明连接池-->    <Resource name="jdbc/mysql&qu...
    99+
    2022-10-25
  • 怎么创建mysql数据库连接池
    在mysql中利用DBUtils创建数据库连接池的方法具体方法如下:import pymysqlfrom DBUtils.PooledDB import PooledDB, SharedDBConnectionPOOL = PooledDB...
    99+
    2022-10-05
  • c#怎么用mysql数据库连接池
    c#用mysql数据库连接池的示例:class DbConn{private const int MaxPool=10;//最大连接数private const int MinPool=5;//最小连接数private const bool...
    99+
    2022-10-13
  • MYSQL数据库管理之权限管理怎么配置
    这篇“MYSQL数据库管理之权限管理怎么配置”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“...
    99+
    2023-03-20
    mysql
  • SpringBoot2 中怎么利用Redis数据库实现缓存管理
    SpringBoot2 中怎么利用Redis数据库实现缓存管理,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、Redis简介Spring Boot中除了对常用...
    99+
    2023-06-02
  • jsp怎么使用mysql数据库连接池
    jsp使用mysql数据库连接池的方法在conf目录中打开context.xml文件,并在文件写如下代码;Web-INF/web.xml然后打开web.xml文件,在文件写入代码;GuestBookjdbc/ConnectionPoolja...
    99+
    2022-10-05
  • python怎么使用mysql数据库连接池
    python使用mysql数据库连接池的方法:安装数据库连接池模块DBUtils。pip3 install DBUtilsDBUtils是一套Python数据库连接池包,并允许对非线程安全的数据库接口进行线程安全包装。下...
    99+
    2022-10-09
  • MySQL数据库缓存原理是什么
    今天就跟大家聊聊有关MySQL数据库缓存原理是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。  MySQL数据库查询步骤有哪些  当MySQL收...
    99+
    2022-10-18
  • MySQL数据库的基本管理
    概述MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理。MySQL是开放源代码的,因此任何人都可以在General Publ...
    99+
    2022-10-18
  • MySQL数据库的权限管理
    Mysql权限系统非常重要,但同时又是一个很多开发者或管理者所忽略的。权限分配不但,将会造成难以挽回的悲惨后果。我之前所在一家公司,关于数据库权限这块就完全不重视,所有开发者都有线上系统的最高权限。想想看,...
    99+
    2022-10-18
  • MySQL数据库及表的管理
    库管理1.创建数据库mysql> help create database; CREATE {DATABASE | SCHEMA}&nbs...
    99+
    2022-10-18
  • MySQL数据库中怎么处理重复的数据
    这篇文章将为大家详细讲解有关MySQL数据库中怎么处理重复的数据,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。方法一:防止出现重复数据也就是说我们再设计表的...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作