MySQL buffer pool中的三种链
一、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中的三种链的更多相关文章
- 【MySQL】mysql buffer pool结构分析
转自:http://blog.csdn.net/wyzxg/article/details/7700394 MySQL官网配置说明地址:http://dev.mysql.com/doc/refman/ ...
- 关于MySQL buffer pool的预读机制
预读机制 两种预读算法 1.线性预读 2.随机预读 对预读的监控 一.预读机制 InnoDB在I/O的优化上有个比较重要的特性为预读,预读请求是一个i/o请求,它会异步地在缓冲池中预先回迁多个页面,预 ...
- Netty中的三种Reactor(反应堆)
目录: Reactor(反应堆)和Proactor(前摄器) <I/O模型之三:两种高性能 I/O 设计模式 Reactor 和 Proactor> <[转]第8章 前摄器(Proa ...
- SuperDiamond在JAVA项目中的三种应用方法实践总结
SuperDiamond在JAVA项目中的三种应用方法实践总结 1.直接读取如下: @Test public static void test_simple(){ PropertiesConfigur ...
- MySQL、SqlServer、Oracle 三种数据库的优缺点
MySQL.SqlServer.Oracle 三种数据库的优缺点 一.MySQL 优点: 缺点: 二.SqlServer 优点: 缺点: 三.Oracle 优点: 缺点: 一.MySQL 优点: 体积 ...
- Java三大框架之——Hibernate中的三种数据持久状态和缓存机制
Hibernate中的三种状态 瞬时状态:刚创建的对象还没有被Session持久化.缓存中不存在这个对象的数据并且数据库中没有这个对象对应的数据为瞬时状态这个时候是没有OID. 持久状态:对象经过 ...
- Asp.Net中的三种分页方式
Asp.Net中的三种分页方式 通常分页有3种方法,分别是asp.net自带的数据显示空间如GridView等自带的分页,第三方分页控件如aspnetpager,存储过程分页等. 第一种:使用Grid ...
- httpClient中的三种超时设置小结
httpClient中的三种超时设置小结 本文章给大家介绍一下关于Java中httpClient中的三种超时设置小结,希望此教程能给各位朋友带来帮助. ConnectTimeoutExceptio ...
- 研究分析JS中的三种逻辑语句
JS中的三种逻辑语句:顺序.分支和循环语句. 一.顺序语句 代码规范如下:1. <script type="text/javascript"> var a = 10; ...
随机推荐
- WCF学习——构建第二个WCF应用程序(四)
一.WCF服务端应用程序 1.创建WCF服务端应用程序项目 打开Visual Studio 2013,在菜单上点击文件->新建->项目->WCF服务应用程序.在弹出界面的" ...
- celery的使用
1.celery的任务调度 # -*- coding: utf-8 -*- import threading from bs4 import BeautifulSoup from tornado im ...
- USACO The Castle
首先看一下题目. The CastleIOI'94 - Day 1 In a stroke of luck almost beyond imagination, Farmer John was sen ...
- Example008关闭IE窗口时,不弹出询问对话框
<!-- 实例008关闭IE主窗口时,不弹出询问对话框 --> <meta charset="UTF-8"> <a href="#" ...
- const vector<int> 和 vector<const int>问题讨论
1.const vector <int> vec(10) —— 与const int a[10]是一回事,意思是vec只有10个元素,不能增加了,里面的元素也是不能变化的 vector&l ...
- 使用ReflectionToStringBuilder实现toString方法
使用ReflectionToStringBuilder实现toString方法 org.apache.commons.lang.builder.ReflectionToStringBuilder是co ...
- 简单地总结几种常见web攻击手段及其防御方式
web攻击手段有几种,本文简单介绍几种常见的攻击手段及其防御方式 XSS(跨站脚本攻击) CSRF(跨站请求伪造) SQL注入 DDOS XSS 概念 全称是跨站脚本攻击(Cross Site Scr ...
- Teacher implements java.io.Serializable
package JBJADV003; public class Teacher implements java.io.Serializable{ private String name; privat ...
- Codeforces Round #418 (Div. 2).C two points
C. An impassioned circulation of affection time limit per test 2 seconds memory limit per test 256 m ...
- 原生JS的HTTP请求
ar xhr = new XMLHttpRequest(); xhr.onreadystatechange = function(){ if( xhr.readyState == 4){ if( xh ...