广告
返回顶部
首页 > 资讯 > 数据库 >浅析MySQL的lru链表
  • 539
分享到

浅析MySQL的lru链表

MySQL链表MySQLlru链表 2022-05-26 16:05:05 539人浏览 安东尼
摘要

一、简述传统的LRU链表 LRU:Least Recently Used 相信大家对LRU链表是不陌生的,它算是一种基础的数据结构吧,而且想必面试时也被问到过什么是LRU链表,甚至是让你手写一个LRU链表。 如果你读

一、简述传统的LRU链表

LRU:Least Recently Used

相信大家对LRU链表是不陌生的,它算是一种基础的数据结构吧,而且想必面试时也被问到过什么是LRU链表,甚至是让你手写一个LRU链表。

如果你读了上一篇:你有没有搞混查询缓存和BufferPool?谈谈看!

想必你已经知道了Mysql的Buffer Pool机制以及mysql组织数据的最小单位是数据页。并且你也知道了 数据页在Buffer Pool中是以LRU链表的数据结构组织在一起的。

其实所谓的LRU链表本质上就是一个双向循环链表,如下图:

下面我们结合LRU链表和数据页机制描述一下Mysql加载数据的机制:

我们将从磁盘中读取的数据页称为young page,young page会被直接放在链表的头部。已经存在于LRU链表中数据页如果被使用到了,那么该数据页也被认为是young page而被移动到链表头部。这样链表尾部的数据就是最近最少使用的数据了,当Buffer Pool容量不足,或者后台线程主动刷新数据页时,就会优先刷新链表尾部的数据页。

二、传统LRU链表的不足

相信你之前肯定听说过操作系统级别的空间局部性原理:

spatial locality(空间局部性):也就是说读取一个数据,在它周围内存地址存储的数据也很有可能被读取到,于是操作系统会帮你预读一部分数据。

MySQL也是存在存在预读机制的!

  1. 当Buffer Pool中存储着一个区中13个连续的数据页时,你再去这个区里面读取,MySQL就会将这个区里面所有的数据页都加载进Buffer Pool中的LRU链表中。(然后可能你根本不会使用这些被预读的数据页)
  2. 当你顺序的访问了一个区中大于 innndb_read_ahead_threshold=56个数据页时,MySQL会自动帮你将下一个相邻区中的数据页读入LRU链表中。(这个机制默认是被关闭的)
  3. 当你执行select * from xxx;时,如果表中的数据页非常多,那这些数据页就会一一将Buffer Pool中的经常使用的缓存页挤下去,可能留在LRU链表中的全部是你不经常使用的数据。

综上你可以看到,所谓的预读机制的优势,实际上违背了LRU去实现将最近最少使用的数据页刷入磁盘的设计初衷。

三、MySQL的LRU链表

接下来我们看下MySQL的Buffer Pool是如何定制LRU链表的,已经LRU帮InnoDB解决了什么问题。

当业务进行大量的CRUD时,需要不断的将数据页读取到buffer pool中的LRU链表中。

MySQL的LRU链表长下面这样。

LRU链表被MidPoint分成了New Sublist和Old Sublist两部分。

其中New Sublist大概占比5/8,Old Sublist占比3/8。

New Sublist存储着young page,而Old Sublist存储着Old Page。

我们可以通过如下的方式查看MidPoint的默认值。

用户可以根据自己的业务动态的调整这个参数!

这其实是一种冷热数据分离设计思想。他相对于传统的LRU链表有很大的优势

四、MySQL定制LRU链表的优势
而对于MySQLLRU链表来说,通过MidPoint将链表分成两部分。

从磁盘中新读出的数据会放在Old Sublist的头部。这样即使你真的使用select * from t;也不会导致New Sublist中的经常被访问的数据页被刷入磁盘中。

正常情况下,访问Old Sublist中的缓存页,那么该缓存页会被提升到New Sublist中成为热数据。

但是当你通过 select * from t 将一大批数据加载到Old Sublist时,然后在不到1s内你又访问了它,那在这段时间内被访问的缓存页并不会被提升为热数据。 这个1s由参数innodb_old_blocks_time控制。

另外:New SubList也是经过优化的,如果你访问的是New SubList的前1/4的数据,他是不会被移动到LRU链表头部去的。

以上就是浅析MySQL的lru链表的详细内容,更多关于MySQL lru链表的资料请关注自学编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: 浅析MySQL的lru链表

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

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

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

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

下载Word文档
猜你喜欢
  • 浅析MySQL的lru链表
    一、简述传统的LRU链表 LRU:Least Recently Used 相信大家对LRU链表是不陌生的,它算是一种基础的数据结构吧,而且想必面试时也被问到过什么是LRU链表,甚至是让你手写一个LRU链表。 如果你读...
    99+
    2022-05-26
    MySQL 链表 MySQL lru链表
  • 深入浅析Java中的链表
    本篇文章为大家展示了深入浅析Java中的链表,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。单链表:insertFirst:在表头插入一个新的链接点,时间复杂度为O(1)deleteFirst:删除表...
    99+
    2023-05-31
    java ava 链表
  • 【MySQL】【ProxySQL】浅析mysql_users表
    【MySQL】【ProxySQL】浅析mysql_users表 1.表定义与字段说明 表的DDL定义: CREATE TABLE mysql_users ( username VARCHAR NOT...
    99+
    2022-10-18
  • JavaScript双向链表实现LRU缓存算法的示例代码
    目录目标什么是LRU简介硬件支持寄存器栈代码实现思路链表节点数据结构链表数据结构LRUCache数据结构完整代码测试目标 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束...
    99+
    2022-11-13
  • 浅谈Python单向链表的实现
    链表由一系列不必在内存中相连的结构构成,这些对象按线性顺序排序。每个结构含有表元素和指向后继元素的指针。最后一个单元的指针指向NULL。为了方便链表的删除与插入操作,可以为链表添加一个表头。 删除操作可以...
    99+
    2022-06-04
    浅谈 链表 Python
  • mysql中的锁浅析
    前言 MySQL 锁机制是保证多个并发事务同时访问数据库时数据一致性的重要手段,也是 MySQL 的重要特性之一。在实际开发使用 MySQL 数据库时,了解并掌握 MySQL 的锁机制非常重要,因为...
    99+
    2023-09-15
    mysql 数据库 锁机制
  • MySQL删除表数据与MySQL清空表命令的3种方法浅析
    目录一、mysql清空表数据命令:truncate二、MySQL删除表命令:drop三、MySQL清空数据表内容的语法:delete补充:MySQL删除表操作delete、truncate、drop的区别总结一...
    99+
    2022-08-17
    删除数据库所有表命令 mysql修改表数据 mysql删除表命令
  • leetcode链表之分割链表的示例分析
    这篇文章主要介绍了leetcode链表之分割链表的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。题目编写程序以 x 为基准分割链表,使得所有小于&...
    99+
    2023-06-19
  • 浅析MySQL的基数统计
    一、基数是啥? Cardinality指的就是MySQL表中某一列的不同值的数量。 如果这一类是唯一索引,那基数 = 行数。 如果这一列是sex,枚举类型只有男女,那它是基数就是2 Cardinality越高,列就越...
    99+
    2022-05-26
    MySQL 统计 MySQL 基数统计
  • MySQL中表锁和行锁机制浅析(源码篇)
    目录前言行锁mysql 事务属性事务常见问题事务的隔离级别间隙锁排他锁共享锁分析行锁定行锁优化表锁共享读锁独占写锁查看加锁情况分析表锁定什么场景下用表锁页锁补充:行级锁与死锁总结前言 众所周知,MySQL的存储引擎有My...
    99+
    2022-11-04
  • 浅析MySQL的WriteSet并行复制
    【历史背景】   岁月更迭中我已经从事MySQL-DBA这个工作三个年头,见证MySQL从“基本可用”,“边缘系统可以用MySQL”,“哦操!你怎么不用MySQL”;   正所谓!“一个数据库的境遇既取决于历史的进程...
    99+
    2022-05-31
    MySQL WriteSet并行复制 MySQL WriteSet MySQL 并行复制
  • 如何浅析mysql中的double write
    这篇文章给大家介绍如何浅析mysql中的double write ,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 介绍double write之前我们有必要了解partial pag...
    99+
    2022-10-19
  • 深入浅析Java中的散列表
    这期内容当中小编将会给大家带来有关深入浅析Java中的散列表,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。基本概念散列表(Hash table,也叫哈希表),是根据关键字(key value)而直接进行访...
    99+
    2023-05-31
    java ava 散列表
  • Java中链表的示例分析
    这篇文章将为大家详细讲解有关Java中链表的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。题目一 解法class Solution {  &nbs...
    99+
    2023-06-29
  • Redis中链表的示例分析
    这篇文章主要介绍Redis中链表的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1 链表和链表节点的结构1 节点结构节点的结构大概长下边这个样子:那么,把这些节点就连起来就成了这个样子:2 链表结构链表自然除...
    99+
    2023-06-22
  • php中链表的示例分析
    这篇文章将为大家详细讲解有关php中链表的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。链表的操作相对顺序表来说就复杂了许多。因为PHP确实已经为我们解决了很多数组操作上的问题,所以我们可以很方便...
    99+
    2023-06-20
  • 浅析mysql主从复制中的gtid
    gtid(Global Transaction ID)是对于一个已提交事务的编号,并且是一个全局唯一的编号。它的官方定义如下:gtid= source_id :transaction_id 每一个 gtid...
    99+
    2022-10-18
  • 如何浅析MySQL中的binlog和redo
    如何浅析MySQL中的binlog和redo,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。    有一个...
    99+
    2022-10-19
  • 浅析Oracle和Mysql分页的区别
    一、Mysql使用limit分页 select * from stu limit m, n; //m = (startPage-1)*pageSize,n = pageSize ...
    99+
    2022-10-18
  • 浅析Mysql和Oracle分页的区别
    目录mysql使用limit进行分页oracle使用rownum进行分页Mysql与Oracle级联查询Mysql省市区级联查询Mysql与Oracle插入数据存在修改不存在新增MySQL使用limit进行分页 sele...
    99+
    2022-12-07
    Mysql和Oracle分页区别 MysqlOracle分页
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作