一、简述传统的lru链表

lru:least recently used

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

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

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

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

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

二、传统lru链表的不足

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

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

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

当buffer pool中存储着一个区中13个连续的数据页时,你再去这个区里面读取,mysql就会将这个区里面所有的数据页都加载进buffer pool中的lru链表中。(然后可能你根本不会使用这些被预读的数据页)

当你顺序的访问了一个区中大于 innndb_read_ahead_threshold=56个数据页时,mysql会自动帮你将下一个相邻区中的数据页读入lru链表中。(这个机制默认是被关闭的)

当你执行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链表的资料请关注萬仟网其它相关文章!

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

mysql冷热数据LRU_浅析MySQL的lru链表相关推荐

  1. mysql 冷热表_Redis+MySQL冷热数据交换

    场景:某网站需要对其项目做一个投票系统,投票项目上线后一小时之内预计有100万用户进行投票,希望用户投票完就能看到实时的投票情况 这个场景可以使用redis+mysql冷热数据交换来解决. 何为冷热数 ...

  2. Redis+MySQL冷热数据交换

    场景:某网站需要对其项目做一个投票系统,投票项目上线后一小时之内预计有100万用户进行投票,希望用户投票完就能看到实时的投票情况 这个场景可以使用redis+mysql冷热数据交换来解决. 何为冷热数 ...

  3. mysql创建数据表列子,MySQL 创建数据库及简单增删改查

    MySQL 创建数据库及简单增删改查 我们可以在登陆 MySQL 服务后,使用 create 命令创建数据库,语法如下: CREATE DATABASE 数据库名; 登入: Enter passwor ...

  4. mysql 冷热数据分离_elasticsearch冷热数据读写分离

    Elasticsearch5.5冷热数据读写分离 前言 冷数据索引:查询频率低,基本无写入,一般为当天或最近2天以前的数据索引 热数据索引:查询频率高,写入压力大,一般为当天数据索引 当前系统日志每日 ...

  5. mysql 线程缓存_浅析MySQL内存的使用说明(全局缓存+线程缓存)

    首先我们来看一个公式,MySQL中内存分为全局内存和线程内存两大部分(其实并不全部,只是影响比较大的 部分): 复制代码 代码如下: per_thread_buffers=(read_buffer_s ...

  6. mysql 数据库设置mysql注入_MYSQL数据库浅析MySQL的注入安全问题

    <MYSQL数据库浅析MySQL的注入安全问题>要点: 本文介绍了MYSQL数据库浅析MySQL的注入安全问题,希望对您有用.如果有疑问,可以联系我们. 如果把用户输入到一个网页,将其插入 ...

  7. mysql amp;amp;_浅析mysql交互式连接amp;非交互式连接

    交互式操作:通俗的说,就是你在你的本机上打开mysql的客户端,就是那个黑窗口,在黑窗口下进行各种sql操作,当然走的肯定是tcp协议. 非交互式操作:就是你在你的项目中进行程序调用.比如一边是tom ...

  8. mysql 导入数据 1215_12、mysql导入数据

    1.mysql命令导入 语法: mysql -u root -p passwd < runoob.sql 2.source命令导入 source aa.sql 3.使用load data导入数据 ...

  9. python往mysql存入数据_Python操作mysql之插入数据

    之前有写过一篇python查询mysql数据的文章,今天写通过python插入数据到mysql数据库. 相关mysql视频教程推荐:<mysql教程> 先建库,建表,建用户mysql> ...

最新文章

  1. Java三大主流框架概述
  2. 使用外部表关联MySQL数据到Oracle
  3. 在windows 2008下不同域活动目录迁移(ADMT3.1)
  4. 在sublime text 3中安装中文支持
  5. volatile的适用场景
  6. 三菱plcfx5u指令手册_从西门子200的PLC程序来看三菱FX5U的PLC程序
  7. 为了不被OUT,UC决定不再安静地做个浏览器了
  8. python opencv最小外接矩形中心点_Opencv绘制最小外接矩形、最小外接圆
  9. AIDA64 硬件规格、系统信息查询工具附带序列号
  10. NOIP2016普及组T2(回文日期)题解
  11. PAT A1119 Pre- and Post-order Traversals ——小楼一夜听春雨,深巷明朝卖杏花
  12. 数据库学习笔记【MySQL】
  13. stack-es-标准篇-ElasticsearchClient-combined_fields
  14. mac环境下搭建hexo+github pages+next个人博客
  15. while、dowhile和for循环
  16. linux etc login.def,Linux-用户管理命令
  17. Ubuntu下HP LaserJet 1000打印机的安装步骤
  18. python控制ppt定时_python自动化怎么操作ppt?
  19. DODO、CoFiX、Bancor谁的无常损失解决方案更胜一筹?
  20. Grafana Labs线上交流问卷调查

热门文章

  1. 【java机器学习】决策树算法
  2. CDH kafka JMX 启动
  3. 构建实时数据仓库首选,云原生数据仓库AnalyticDB for MySQL技术解密
  4. 像数据科学家一样思考:12步指南(下)
  5. 阿里云HBase携X-Pack再进化,重新赋能轻量级大数据平台
  6. 安谋科技发布新业务品牌“核芯动力”,先手布局智能计算产业
  7. “一云多芯、三V一体” 麒麟信安云融合虚拟化方案助力信创轻松上云
  8. 看似简单的搜索引擎,原来背后的数据结构和算法这么复杂?
  9. 面试还搞不懂Redis,快看看这40道面试题!| 博文精选
  10. 盘点丨2019十大边缘计算项目