当前位置: 首页 > article >正文

MySQL 之LRU 缓存管理算法

在 MySQL 中,特别是针对 InnoDB 存储引擎,LRU(Least Recently Used 最近最少使用)算法用于管理缓冲池中的数据页。以下是关于 MySQL 中 LRU 算法的详细介绍及其相关参数的影响。
LRU 算法概述

  • 定义:

LRU 算法是一种缓存淘汰策略,用于管理有限的缓存资源。
当缓存空间不足时,LRU 算法会选择最近最少使用的数据页进行替换。

  • 应用场景:

MySQL 的 InnoDB 存储引擎使用 LRU 算法管理缓冲池中的数据页。
缓冲池(Buffer Pool)是 InnoDB 中用于缓存数据页和索引页的重要组件。


LRU 算法的工作原理

  • 数据结构:

InnoDB 使用双向链表(Doubly Linked List)和哈希表(Hash Table)来实现 LRU 算法。
双向链表用于维护数据页的顺序。
哈希表用于快速查找数据页。

  • 操作流程:

插入操作:


当新的数据页需要插入缓冲池时,首先检查该数据页是否已经在缓存中。
如果不在缓存中,则将其插入到双向链表的头部,并在哈希表中添加相应的映射。
如果缓存已满,则需要淘汰最近最少使用的数据页,即删除双向链表的尾部数据页,并在哈希表中删除相应的映射。


访问操作:
当访问一个数据页时,首先检查该数据页是否在缓存中。
如果在缓存中,则将其从当前位置移动到双向链表的头部,并更新哈希表中的映射。
如果不在缓存中,则执行插入操作。


影响 LRU 算法的参数

  • innodb_buffer_pool_size:

定义:缓冲池的大小。
影响:
较大的缓冲池大小可以容纳更多的数据页,减少缓存缺失(misses)。
较小的缓冲池大小可能导致更高的缓存替换频率,增加缓存缺失率。

如果一台服务器专用作MySQL数据库使用时,通常将70%~80%(具体看总内存大小而定)的物理内存空间分配给缓冲池。

  • innodb_lru_scan_depth:

定义:控制 LRU 列表扫描的深度。
影响:
较大的扫描深度(如默认值 1024)会导致更深入的 LRU 列表扫描,从而找到更久未使用的页面。
较小的扫描深度(如 128)会导致更浅的 LRU 列表扫描,从而更快找到最近未使用的页面,但可能导致更频繁的数据页替换。

缓存数据没有具体的有效时间,但通过扫描深度可以控制长时间未使用的数据尽快被清理

  • innodb_old_blocks_time:

定义:新插入的数据页在 LRU 列表的新部分停留的时间(毫秒)。
影响:
较长的时间(如 1000 毫秒)可以让新插入的数据页在 LRU 列表的新部分停留更长时间,减少频繁的替换。
较短的时间(如 100 毫秒)会让新插入的数据页更快进入 LRU 列表的老部分,可能导致更频繁的替换。

  • innodb_old_blocks_pct:

定义:老数据页在 LRU 列表中所占的比例(百分比)。
影响:
较高的比例(如 37)意味着 LRU 列表的老部分更大,可以容纳更多较旧的数据页。
较低的比例(如 10)意味着 LRU 列表的老部分较小,可能导致更频繁的数据页替换。

  • innodb_max_dirty_pages_pct:

定义:控制脏页的最大比例。
影响:
较高的脏页比例(如 90%)允许更多的脏页存在,从而减少后台刷新操作,提高写入性能。
较低的脏页比例(如 75%)会更频繁地触发后台刷新操作,从而减少脏页数量,提高数据一致性。


http://www.kler.cn/a/350365.html

相关文章:

  • 前端 window.print() 打印图片
  • linux如何并行执行命令
  • Python----Python高级(文件操作open,os模块对于文件操作,shutil模块 )
  • 单片机基础模块学习——定时器
  • leetcode刷题记录(七十二)——146. LRU 缓存
  • 《开源与合作:驱动鸿蒙Next系统中人工智能技术创新发展的双引擎》
  • ESP32-S3芯片AI开发应用,图像识别与语音唤醒方案,启明云端乐鑫代理商
  • 24/10/12 算法笔记 NiN
  • Linux10-9
  • Git 深度解析 —— 从基础到进阶
  • [哈工大]战德臣 数据库系统 第3讲 关系模型之基本概念
  • 【时时三省】(C语言基础)函数介绍strcat
  • p20 docker自己commit一个镜像 p21 容器数据卷 p22mysql同步数据(国内镜像被封锁暂时往后放)p23具名挂载和匿名挂载
  • 代码随想录算法训练营第五十五天| 图论入门
  • C#源码安装ZedGraph曲线显示组件
  • flutter 使用三方/自家字体
  • 深度学习:LSTM循环神经网络实现评论情感分析
  • 【rk3229 android10 多wifi模块兼容提示bt报错问题】
  • PHP cURL 教程
  • 从零实现llama3(学习)
  • PLM预训练语言模型Pre-trained Language Model
  • 【C#生态园】从身份认证到日志记录:C#开发必备库全面解析
  • 重学SpringBoot3-集成Spring Security(二)
  • VAE(与GAN)
  • 简单谈谈Spring 中Aware是什么
  • 【优选算法】(第四十二篇)