三种page、三种list、LRU控制调优

一、innodb buffer pool中的三种页

1、free page:从未用过的页

2、clean page:干净的页,数据页的数据和磁盘一致

3、dirty page:脏页

SQL执行需求:

  1、找free页

  2、刷新脏页

    1、这个页不是热的数据页(刷冷页)

    2、这个页最早修改时间(刷修改时间比较早的页,有可能是热页),方便日志文件的覆盖

  3、覆盖冷的clean页

为了实现上述需求,innodb用到链表技术(每种链表一种作用,链的存在意义是为了遍历)。

二、innodb buffer pool中的三种链

1、free list:将free数据页使用链表链起来

  数据库刚启动的时候,lru列表为空,此时需要用到的时候直接将free列表中的页删除,在lru列表中增加相应的页,维持页数守恒。

2、lru list:根据冷热将clean、dirty链起来

  least recent used(最近最少使用)

  1、“中点插入策略”

  2、回写尽量回写冷的脏块

  3、覆盖尽量覆盖冷的脏块

LRU标准算法:

  1)3/8的list信息是作为old list,这些信息是被驱逐的对象。

  2)list的中点就是我们所谓的old list头部和new list尾部的连接点,相当于一个界限。

  3)新数据的读入首先会插入到old list的头部。

  4)如果是old list的数据被访问到了,这个页信息就会变成new list,变成young page,就会将数据页信息移动到new sublist的头部。

  5)在数据库的buffer pool里面,不管是new sublist还是old sublist的数据如果不会被访问到,最后都会被移动到list的尾部作为牺牲者。

3、flush list:将页按照最早脏时间链起来

  flush list中的也全都是脏页,刷盘即将flush list中的脏页刷新回磁盘中。

  1、将非常旧的脏块回写到磁盘,按照新旧回写数据页;

  2、因为是从最早脏的块开始刷,这样logfile里的对应的日志就可以被覆盖了。

Q:为什么需要这三种链 ?
A:

  因为在innodb 缓冲池中,内存管理如下:
  1、需要经常找 free 空闲数据块:free list。
  2、需要经常找冷的数据块:lru list(最近最少使用,根据冷热链起来)。
  3、需要知道哪些数据块是比较早脏的,flush list:我们要覆盖旧的 logfile,就需要系统将这些 logfile 对应的脏块,即将 flush list 链上的脏页往磁盘上刷,(批量往磁盘写的时候,不如刷脏页)。

三、LRU冷热区控制及调整

1、设置冷热分界线:innodb_old_blocks_pct

2、成为热块的所需时间:innodb_old_blocks_time

mysql> show variables like '%old_blocks%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| innodb_old_blocks_pct  | 37    |
| innodb_old_blocks_time | 1000  |
+------------------------+-------+
2 rows in set (0.01 sec)

  通过 innodb_old_blocks_pct 参数值得设定分为两部分:一是存放长时间未被访问的数据页,二是存放最近被访问的数据页。靠近 LRU 链表头部的数据页表示最近经常被访问,靠近尾部表示数据页长期未被访问,这两个部分的交汇处称为 midpoint,即 innodb_old_blocks_pct这个点的设置。默认是37%,最小是5,最大是95;如果内存比较大的话,可以将这个数值调低,通常会调成20,也就是说20%的是冷数据块。目的是为了保护热区数据不被刷出内存。

  通过innodb_old_blocks_time参数来控制成为热数据的所需时间,默认是1000ms,也就是1s,也就是数据在1s内没有被刷走,就调入热区。

3、LRU冷热数据的监控

mysql> show engine innnodb status\G
……
Pages made young 0, not young 0
0.00 youngs/s, 0.00 non-youngs/s

  1、数据页从冷到热,称为young;not young就是数据在没有成为热数据情况下就被刷走的量(累计值)。

  2、non-youngs/s,这个数值如果很高,一般情况下就是系统存在严重的全表扫描,自然意味着很高的物理读。

  3、youngs/s,如果这个值相对较高,最好增加一个innodb_old_blocks_time,降低innodb_old_blocks_pct,保护热数据。

MySQL buffer pool中的三种链相关推荐

  1. MySQL buffer pool里的三种链表和三种page

    mysql buffer pool里的三种链表和三种page buffer pool是通过三种list来管理的 1) free list 2) lru list 3) flush list buffe ...

  2. mysql报错注入_关于Mysql注入过程中的三种报错方式

    放点原来的笔记,Mysql在执行语句的时候会抛出异常信息信息,而php+mysql架构的网站往往又将错误代码显示在页面上,这样可以通过构造如下三种方法获取特定数据. 实际测试环境: Default m ...

  3. [MySQL 源码] 从buffer pool中获取空闲block流程

    当我们将一个page读入内存时,需要先为其分配一个block,从buffer pool中获取.入口函数为buf_LRU_get_free_block 之前在http://mysqllover.com/ ...

  4. mysql临键锁_详解 MySql InnoDB 中的三种行锁(记录锁、间隙锁与临键锁)

    详解 MySql InnoDB 中的三种行锁(记录锁.间隙锁与临键锁) 前言 InnoDB 通过 MVCC 和 NEXT-KEY Locks,解决了在可重复读的事务隔离级别下出现幻读的问题.MVCC  ...

  5. 关于MySQL buffer pool的预读机制

    预读机制 两种预读算法 1.线性预读 2.随机预读 对预读的监控 一.预读机制 InnoDB在I/O的优化上有个比较重要的特性为预读,预读请求是一个i/o请求,它会异步地在缓冲池中预先回迁多个页面,预 ...

  6. mysql如何防止插入重复数据_防止MySQL重复插入数据的三种方法

    新建表格 CREATE TABLE `person` ( `id` int NOT NULL COMMENT '主键', `name` varchar(64) CHARACTER SET utf8 C ...

  7. mysql 禁止插入重复数据_防止MySQL重复插入数据的三种方法

    新建表格 CREATE TABLE `person` ( `id` int NOT NULL COMMENT '主键', `name` varchar(64) CHARACTER SET utf8 C ...

  8. MySQL、SqlServer、Oracle 三种数据库的优缺点总结

    MySQL.SqlServer.Oracle 三种数据库的优缺点总结 一.MySQL 二.SqlServer 三.Oracle 一.MySQL 优点: 体积小.速度快.总体拥有成本低,开源: 支持多种 ...

  9. Mysql清除表数据的三种方式

    Mysql 删除数据表的三种方式详解 用法: 1.当你不再需要该表时, 用 drop; 2.当你仍要保留该表,但要删除所有记录时, 用 truncate; 3.当你要删除部分记录或者有可能会后悔的话, ...

最新文章

  1. 2008年 浙工大考研计算机专业课试题C++
  2. 猎头出500万年薪挖百度某高T,却被对方拒绝!网友:钱不是最重要的!
  3. OpenUPF 的设备形态与架构设计
  4. Nodejs in Visual Studio Code 03.学习Express
  5. linux tomcat apr安装,Linux下Tomcat安装并开启APR模式-Go语言中文社区
  6. 视频检索扫盲 (一)
  7. String、String Buffer、StringBuilder区别与比较
  8. css两列布局之基于BFC规则实现
  9. php 模拟并发请求_PHP模拟并发请求
  10. 阿里云服务器部署Java Web项目全过程
  11. matlab find返回空集,Model.find()在猫鼬中返回空
  12. cad图纸问号怎么转换文字_教你如何解决CAD图纸上字体显示问号的问题
  13. 儿童编程软件python-一款儿童编程入门的理想工具——PythonTurtle
  14. java语言难度最大的地方_学习难度最高的五大编程语言
  15. [原创摄影]西藏行(一)从不同角度看布达拉
  16. 《2021企业数智化转型升级创新服务企业》榜重磅发布
  17. 删除鼠标右键多余的菜单
  18. electron-builder 打包 exe 异常错误集锦
  19. 会计期间(转摘至互动百科)
  20. Springboot连接mysql数据库(jdbcTemplate)

热门文章

  1. linux网络寻址顺序,51CTO博客-专业IT技术博客创作平台-技术成就梦想
  2. php自定义模块,简单介绍OpenCart自定义模块
  3. vim 改变当前工作路径和创建文件夹
  4. 陕西师范大学计算机专业录取,陕西师范大学计算机类专业2016年在山西理科高考录取最低分数线...
  5. python写音乐播放器_python 模拟(简易)音乐播放器
  6. ddr4单颗粒最大_Zynq UltraScale +系列之“DDR4接口设计”
  7. 完美世界手游不显示新服务器,完美世界手游手Q互通-黑曜开服时间表_完美世界手游新区开服预告_第一手游网手游开服表...
  8. 深度拷贝 java_Java深度拷贝方式和性能对比
  9. 【存储知识学习】第六章-磁盘阵列-《大话存储》阅读笔记
  10. 已知项目有风险,作为项目经理接还是不接?