原文:http://huanghualiang.blog.51cto.com/6782683/1372721

一、MyISAM Key Cache详解:

为了最小化磁盘I/O,MyISAM将最频繁访问的索引块(“indexblock”)都放在内存中,这样的内存缓冲区我们称之为Key Cache,它的大小可以通过参数key_buffer_size来控制。在MyISAM的索引文件中(MYI),连续的单元(contiguous unit)组成一个Block,Index block的大小等于该BTree索引节点的大小。Key Cache就是以Block为单位的。

1. MyISAM如何使用Key Cache

当MySQL请求(读或写)MyISAM索引文件中某个IndexBlock时,首先会看Key Cache队列中是否已经缓存了对应block。如果有,就直接在Key Cache队列中进行读写了,不再需要请求磁盘。如果是写请求,那么Key Cache中的对应Block就会被标记为Dirty(和磁盘不一致)。在MyISAM在Key Cache成功请求(读写)某个Block后,会将该Block放到Key Cache队列的头部。

如果Key Cache中没有待请求(读或写)的Block,MyISAM会向磁盘请求对应的Block,并将其放到KeyCache的队列头部。队列如果满了,会将队列尾部的Block删除,该Block如果是Dirty的,会将其Flush到磁盘上。我们看到MyISAM维护了一个LRU(Least Recently Used)的Key Cache队列。队列中的Dirty Block会在Block被踢出队列时Flush到磁盘上。

2. 并发访问

Key Cache中的index Block是可以被并发访问的(Shared access ),下面是一些规则:

a.多个没有更新操作的session可以并发同一个block buffer

b.多个session同时访问某一个block buffer,如果某个session是update操作,则优先访问

c.多个session如果都需要进行block replacement,是可以并发操作。(从index file中读取block更新到key cache,但是key cache已满,需要删除一些block buffer的操作叫做block replacement)

设置多key buffer

set global hot.key_buffer_size=xx; #hot、cold 是key buffer的名字,可随意取

set global colkd.key_buffer_size=xx;

CACHE INDEX example.top_message IN  hot_cache

CACHE INDEX example.event IN cold_cache

LOAD INDEX INTO CACHEexample.top_message,example.event IGNORE LEAVES; #预加载,可以放在配制文件中,启动后数据库key buffer命中率会提升.

LOAD INDEX INTO CACHE example.user IGNORELEAVERS,expamle.groups

二、MySQL管理key buffer算法:

MySQL默认使用LRU算法(因默认key_cache_division_limit= 100,只有一个chain,不使用“中点插入算法”。

Key Cache的LRU算法,作为对LRU算法的改进,MyISAM还提供了另一个缓存算法:“MidpointInsertion Strategy”。

Midpoint Insertion Strategy(中点插入算法)-将LRU链分成hot子表warm子表。

1. 相关参数

该策略涉及的参数有:key_cache_division_limit、key_cache_age_threshold

key_cache_division_limit=70  --  %30的缓存做hot

key_cache_age_threshold:Hotsub-chain中的顶部的block停留时间超过一个阈值后就会被降级到warm sub-chain。具体的计算方法是:设N为key cache中的block个数,如果在最近的N*key_cache_age_threshold/100次访问中,keycache顶部的block仍然没有被访问到,那么就会被移到warmsub-chain的顶部。

2. 原理介绍

(1).该策略将前面的LRU队列(LRU Chain)分成两部分,hot sub-chain和warm sub-chain。并根据参数key_cache_division_limit划分,总保持warm sub-chain在这个百分比以上。默认情况key_cache_division_limit是100,所以默认时候只有warmsub-chain,即LRU Chain。

(注:Multiple Key cache情况,每个key cache都有对应的key_cache_division_limit值)

(2).在warm sub-chain中的某个block如果被访问(Access)次数超过某个值时候,就将该block放到hot sub-chain的底部。

(3).在hot sub-chain中的block会随着每一次的hit调整位置,hit越多,越接近底部。在顶部停留时间过长就会被降级到warm sub-chain中,而且是warm sub-chain的顶部(很可能很快就会被移出key cache)。

(4).Hot sub-chain中的顶部的block停留时间超过一个阈值后就会被降级到warm sub-chain。这个阈值由参数key_cache_age_threshold决定。具体的计算方法是:设N为key cache中的block个数,如果在最近的(N*key_cache_age_threshold/100)次访问中,keycache顶部的block仍然没有被访问到,那么就会被移到warm sub-chain的顶部。

(5).默认情况key_cache_division_limit = 100,这时只有只有一个Chain,所以不使用该策略。即退化的Midpoint Insertion Strategy是LRU算法。

*key buffer一些参数指标:

物理读:key_read/key_read_requests一般要应小于0.01,否则key buffer设置小了。

key_writes/key_write_requests #看写多不多,若很多接近1

使用率:1-((key_block_unused*key_cache_block_size)/key_buffer_size) # 一般在80%左右比较优,大于80%,可能是keybuffer设置过小,小于80% 可能是key buffer设置过大,导致内存资源浪费。

(转)MyISAM Key Cache详解及优化的更多相关文章

  1. my.cnf 详解与优化【转】

    MySQL配置文件my.cnf 例子最详细翻译,可以保存做笔记用. #BEGIN CONFIG INFO#DESCR: 4GB RAM, 只使用InnoDB, ACID, 少量的连接, 队列负载大#T ...

  2. tomcat常用配置详解和优化方法

    tomcat常用配置详解和优化方法 参考: http://blog.csdn.net/zj52hm/article/details/51980194 http://blog.csdn.net/wuli ...

  3. JS中的函数节流throttle详解和优化

    JS中的函数节流throttle详解和优化在前端开发中,有时会为页面绑定resize事件,或者为一个页面元素绑定拖拽事件(mousemove),这种事件有一个特点,在一个正常的操作中,有可能在一个短的 ...

  4. apache配置文件详解与优化

    apache配置文件详解与优化 一.总结 一句话总结:结合apache配置文件中的英文说明和配置详解一起看 1.apache模块配置用的什么标签? IfModule 例如: <IfModule ...

  5. linux ssh使用深度解析(key登录详解)

    linux ssh使用深度解析(key登录详解) SSH全称Secure SHell,顾名思义就是非常安全的shell的意思,SSH协议是IETF(Internet Engineering Task ...

  6. Dockerfile详解及优化

    Dockerfile详解 0. Dockerfile的作用 docker可以根据Dockerfile中的指令来构建docker镜像.Dockerfile是一个文本文件,其应当包含用户想要构建一个镜像的 ...

  7. Tomcat记录-tomcat常用配置详解和优化方法(转载)

    常用配置详解 1 目录结构 /bin:脚本文件目录. /common/lib:存放所有web项目都可以访问的公共jar包(使用Common类加载器加载). /conf:存放配置文件,最重要的是serv ...

  8. Guava Cache详解

    适用性 缓存在很多场景下都是相当有用的.例如,计算或检索一个值的代价很高,并且对同样的输入需要不止一次获取值的时候,就应当考虑使用缓存 Guava Cache与ConcurrentMap很相似,但也不 ...

  9. php详解和优化

    nginx结合php使用FastCGI方式 apache结合php,php是作为一个模块加载到apache中 (1)FastCGI工作原理 1.用户发送http请求报文给nginx服务器 2.ngin ...

随机推荐

  1. JS各种情况处理

    1.获取URL及其参数 实例:URL:file:///C:/Program%20Files/nodejs/test/jumbTarget.html?a=1&&b=2&& ...

  2. 基于行块分布函数的通用网页正文内容抽取(带HTML格式)

    算法思路: 假如网页正文(过滤html标签后的)有n行,以k行为一行块,总共可构成n-k+1行块: 以行号为索引号,以行块长度为索引值,形成行块稀疏矩阵: 以上面的稀疏矩阵为基础,找出其骤升骤降点,分 ...

  3. 大数据hadoop分布式系统

    1>hadoop简介: Hadoop是一个开发和运行处理大规模数据的软件平台,是Apache的一个用java语言实现开源软件框架,实现在大量计算机组成的集群中对海量数据进行      分布式计算 ...

  4. CentOS下安装PHP的AMQP扩展方法和步骤

    AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.基于此协议的客户端 ...

  5. 基于JSP+Servlet开发高校社团管理系统(前台+后台) 源码

    基于JSP+Servlet开发高校社团管理系统(前台+后台): 开发环境:    Windows操作系统 开发工具:Eclipse/MyEclipse+Jdk+Tomcat+MYSQL数据库 运行效果 ...

  6. [LeetCode 题解]:Gray Code

    题目描述: The gray code is a binary numeral system where two successive values differ in only one bit. G ...

  7. 纯分享scp协议如何工作

    scp协议是什么, wiki上说: Secure copy or SCP is a means of securely transferring computer files between a lo ...

  8. Linux Guard Service - 守护进程分裂

    分裂守护进程 由于fork()后第一行仍然在循环中,使用fork()返回值鉴别当前进程的性质 int i = 0; for (i = 0; i < 10; i++) { // sleep(1); ...

  9. ubuntu 中安装 Redis

    1.下载安装root@21ebdf03a086:/# apt-cache search redisroot@21ebdf03a086:/# apt-get install redis-server a ...

  10. 序列(DP)(组合数)

    这是一个DP题. 我们设\(f[i][j][k]\)表示\(i\)序列长度中放入了\(j\)个元素,其中\(k\)是限定的众数的个数:状态转移方程是 \[f[k][i][j]=f[k][i-1][j- ...