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

DBA面试题:MySQL缓存池LRU算法做了哪些改进?

下图是MySQL(MySQL5.7版本)体系架构图

9531b162c65c4171a69fdcd3981b5272.png

MySQL的InnoDb Buffer Pool 缓冲池是主内存中的一个区域,用来缓存InnoDB在访问表和索引时的数据。对于频繁使用的数据可以直接从内存中访问,从而加快处理速度。如果一台服务器专用作MySQL数据库使用时,通常将70%~80%(具体看总内存大小而定)的物理内存空间分配给缓冲池。

缓冲池由多个缓冲池实例(innodb_buffer_pool_instances)组成,每个实例都有自己的锁和数据结构,这样可以在多线程环境中提高并发性能。缓冲池中的页可以分为干净页和脏页,干净页是指与磁盘上的数据一致的页,而脏页则是指已经被修改但尚未写回磁盘的页。InnoDB会定期将脏页刷新回磁盘,以确保数据的持久性

1.  LRU算法

LRU(Least Recently Used,最近最少使用)是一种常见的缓存替换算法,通常用于管理缓存中的数据页面。该算法基于一个简单的思想:当缓存空间不足时,将最近最少被访问的数据页替换出去,以便为新的数据页腾出空间。

LRU算法维护一个数据结构,通常是一个链表或者是一个数组,用于记录数据页面的访问顺序。每当一个数据页面被访问时,就将其移动到链表或数组的头部(或其他适当位置),表示最近被访问。当缓存空间不足时,将链表或数组尾部的数据页面替换出去,因为它们是最近最少被访问的。

LRU算法的优点是简单易实现,并且通常能够有效地利用缓存空间,保留最近被频繁访问的数据页面,从而提高缓存命中率,减少磁盘IO操作,提升系统性能。然而,LRU算法也存在一些缺点,比如需要维护一个有序的数据结构,当缓存数据量非常大时,可能会导致性能下降。

MySQL为了提高大批量数据读取操作的效率,将缓冲池划分为可以潜在地容纳多行的页面。为了提高缓存管理的效率,缓冲池被实现为页面的链接列表;最近很少被使用的数据会使用LRU算法的变体从缓存中淘汰出去。

2.  MySQL中的LRU优化

在MySQL中,针对传统的LRU算法进行了优化,以解决全表扫描和预读机制可能带来的性能问题。这种优化被称为“冷热分离”,它将LRU链表分为两部分:一部分用于存放冷数据(即最近加载但尚未被频繁访问的数据页),另一部分用于存放热数据(即经常被访问的数据页)。这样,即使进行全表扫描或预读操作,也不会立即影响到那些热数据页的位置,从而保持了缓冲池的高命中率和性能。

1aabf62b04e9a0242b69544e2a7187c3.png

默认情况下,优化后的LRU算法将5/8的缓冲池空间用于存放热数据,3/8的空间用于存放冷数据,冷热区域的边界叫做midpoint区。

当InnoDB将一个页面读入缓冲池时,它最初会将其插入midpoint区(即冷数据区的头部)。此后页面可能被读取,因为它是用户发起的操作(例如SQL查询或作为InnoDB自动执行的预读操作的一部分)。

而访问冷数据区中的页面时会将此页面变“热”,进而将其移到热数据区的头部。如果页面是由于用户发起的操作而被读取的,则首次访问会立即发生,并且页面会变为“热”。如果页面是由于预读操作而被读取的,则首次访问不会立即访问,并且在页面被驱逐之前可能也永远不会被访问。

随着数据库的运行,未被访问的缓冲池中的页面通过向列表的尾部移动而“老化”。随着其他页面被设置为新页面,冷数据区中的页面都会老化。随着页面被插入midpoint,冷数据区中的页面也会老化。最终,保持未使用的页面被推向冷数据区的尾部并被驱逐。

3. 小结

MySQL使用LRU(最近最少使用)算法来管理其InnoDB存储引擎的缓冲池(Buffer Pool),因为这种算法能有效地维护缓存页的使用频率和顺序。LRU算法通过淘汰长时间未被访问的数据页,确保缓冲池中存储的是最可能被再次访问的数据,从而提高数据检索的效率。

在实际应用中,MySQL对传统的LRU算法进行了优化,以解决全表扫描和预读机制可能带来的性能问题。这种优化被称为冷热分离,它将LRU链表分为两部分:一部分用于存放冷数据(即最近加载但尚未被频繁访问的数据页),另一部分用于存放热数据(即经常被访问的数据页)。这样,即使进行全表扫描或预读操作,也不会立即影响到那些热数据页的位置,从而保持了缓冲池的高命中率和性能

9b4340f1c380a50639270a0d4b4fb95f.png

往期精彩回顾

1.  MySQL高可用之MHA集群部署

2.  mysql8.0新增用户及加密规则修改的那些事

3.  比hive快10倍的大数据查询利器-- presto

4.  监控利器出鞘:Prometheus+Grafana监控MySQL、Redis数据库

5.  PostgreSQL主从复制--物理复制

6.  MySQL传统点位复制在线转为GTID模式复制

7.  MySQL敏感数据加密及解密

8.  MySQL数据备份及还原(一)

9.  MySQL数据备份及还原(二)

a345eba78a7b693b522423260f6a4bc8.png

扫码关注     

4b25c601044bd28052789a7d432b8975.jpeg

bd879ce7ef5cb6d4ef93b30ab53a7662.png

545d838b331f952e8a7579e1e426c159.png

http://www.lryc.cn/news/318674.html

相关文章:

  • idea+vim+pycharm的块选择快捷键
  • ansible 部署FATE集群单边场景
  • 融入Facebook的世界:探索数字化社交的魅力
  • stm32-定时器输出比较PWM
  • Redis对过期key的删除策略
  • http的body格式
  • Java Web开发从0到1
  • 002——编译鸿蒙(Liteos -a)
  • Ansible--详解
  • Django和Mysql数据库
  • [蓝桥杯]-最大的通过数-CPP-二分查找、前缀和
  • 安卓UI面试题 26-30
  • CPU、GPU、IPU、NPU、TPU、LPU、MCU、MPU、SOC、DSP、FPGA、ASIC、GPP、ECU、
  • 鸿蒙车载原生开发,拓展新版图
  • 15届蓝桥杯第二期模拟赛题单详细解析
  • mysql统计数据库大小
  • centos防火墙firewall-cmd限定特定的ip访问
  • 创维汽车与创维光伏储能亮相2024上海AWE,感受制造业的升级变迁
  • Kafka配置SASL_PLAINTEXT权限。常用操作命令,创建用户,topic授权
  • [Java、Android面试]_05_内存泄漏和内存溢出
  • MySQL-HMA 高可用故障切换
  • 深度学习 精选笔记(11)深度学习计算相关:GPU、参数、读写、块
  • 深度学习 Day27——J7对于ResNeXt-50算法的思考
  • 华为配置敏捷分布式SFN漫游实验
  • 续上篇 qiankun 微前端配置
  • AI日报:欧盟人工智能法案通过后行业面临合规障碍
  • 音视频如何快速转二维码?在线生成音视频活码的教程
  • 开源堡垒机Jumpserver安装教程
  • CentOS 7 socat命令端口转发 —— 筑梦之路
  • SeaTunnel 2.3.4 Cluster in K8S