原文: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. poj—1753 (DFS+枚举)

                                                                                                        ...

  2. thinkjs用户请求处理

  3. 3、Semantic-UI之定义容器

    3.1 定义容器   在主流的前端框架中都会有容器的概念,但是在Semantic-UI中,如果要定义容器需要通过class="ui container",定义容器后,浏览器会根据不 ...

  4. java 添加到数据库的数据没有时分秒

    检查hibernate实体类的映射文件日期类型把date 改为 java.util.Date

  5. Qt学习(一)

    1. 简介 跨平台 GUI 通常有三种实现策略 API 映射 相当于将不同平台的 API 提取公共部分.界面库使用同一套 API,将其映射到不同的底层平台上面.相当于取交集 如wxWidgets. 优 ...

  6. 927. Three Equal Parts

    Given an array A of 0s and 1s, divide the array into 3 non-empty parts such that all of these parts ...

  7. 二,PHP缓存机制详解

    一,PHP缓存机制详解 我们可以使用PHP自带的缓存机制来完成页面静态化,但是仅靠PHP自身的缓存机制并不能完美的解决页面静态化,往往需要和其他静态化技术(通常是伪静态技术)结合使用. output ...

  8. PHP中implode()和explode()

    1, implode()函数返回由数组元素组合成的字符串,函数语法:string implode(separator,array),separator参数可选,规定数组元素之间放置的内容,默认是空字符 ...

  9. mysqli扩展库---------预处理技术

    1, PHP程序与mysql之间处理sql语句流程如下,减少执行时间方式有三种: ① 减少php发送sql次数: ② 减少php与mysql之间网络传输时间: ③ 减少mysql的编译时间: 2, 预 ...

  10. python 导入模块与使用

    学习python之前一定要了解导入模块是怎么导入的,至少在看代码时不知道能很快的了解别人写的东西是哪里来. Python默认仅安装部分基础或核心模块,启动时也仅加载了基础模块,在需要是再显式的加载其他 ...