你的位置:面向PHP >> 资讯 >> 数据库 >> Mysql >> 详细内容 在线投稿

详解MyISAM Key Cache(后篇)

热度120票  浏览25次 【共0条评论】【我要评论 时间:2010年2月03日 10:41
文章信息

来源:转载

J.uI Fr0在前两篇(前篇中篇) 中,分别介绍了Key Cache的基本原理(LRU和Midpoint Insertion Strategy)。最后,将介绍一些相关的参数、状态参数和命令。面向PHP kD`y [~

面向PHP#Nx/i a!k5g

Key Cache的配置很灵活,可以针对全局配置,还可以针对某个单独数据表分配Key Cache的大小;如果一个数据表某部分的索引块被访问的非常频繁(较之其他索引块),那么可以配置Midpoint Insertion Strategy达到最大的利用率(参考)。面向PHP e3H-O/T@jCF

'[K n8]"UC01. 如何配置Key Cache的大小面向PHPr j"g{/z*fUp


$s&d7{U)`b:\0#配置文件my.cnf
2r1Z]yZ\0key_buffer_size=50*1024*1024
^6~}| {S0
面向PHP)g+^py/QG

ltSE"R@3T'd0另外,Key Cache的大小可以动态的改变面向PHP#m-f6`}"a.~?

面向PHP l3sC$b Zm:]b

2. 给数据表划分单独的Key Cache面向PHP|(?A(A{%^1I

面向PHPFNzu?3_)P2b

例如:划分一块128K的Key buffer空间,指定数据表t1的Key cache放在里面。最后演示了如何删除这个特定的Key buffer空间。面向PHPI2M3O&Gi9],lUk


T1hw e K)Q u%T0SET GLOBAL hot_cache.key_buffer_size=128*1024;
8uAav^"Mmni@_0CACHE INDEX t1 IN hot_cache;面向PHPy ]U Q;V!m{
SET GLOBAL hot_cache.key_buffer_size=0;面向PHP8MV Y E H1f

F%M"Wx6l9Ji8f c6`6b4B0

[N[&[4Emi03. 预先载入某些数据表的索引面向PHP;i"[4Or,x,l U


/?cUK@8el0LOAD INDEX INTO CACHE t1, t2
?I"vsw5C,?+P0
面向PHP:SE|Dk%@t3I5G

4IkA:qS Ma04. 关于Key Cache的使用情况观察 Flush现象面向PHPJER3Jr

面向PHP{4VQd9?nnQ4J2B8h
mysql> show status like "key%";
.cs'@7AqB*R9F0+------------------------+----------+面向PHP3Bseg(Q9|
| Variable_name | Value |面向PHPwSFaGS$t$Vgf
+------------------------+----------+面向PHPnq+L)g5q$C
| Key_blocks_not_flushed | 14468 |
_j\9I'yZh0| Key_blocks_unused | 0 |
}lq_*s0| Key_blocks_used | 14497 |面向PHP!KX w'f%}.h#qM:m%L2t
| Key_read_requests | 30586575 |面向PHP?6t?j A0E9ziW
| Key_reads | 157 |面向PHP&|I3~!N;[6U O'e
| Key_write_requests | 7100408 |
%AV3e.ep6_;Zu(V5P0| Key_writes | 1199800 |
z(l.R7TVK$S9U3ns^ z0+------------------------+----------+面向PHPM#~aO7F aw+r s
mysql> flush tables; (注意,请不要在业务高峰期执行面向PHPi_,P`^H6M
+------------------------+----------+面向PHP:Q5Zqm[]2E^ i Z
| Variable_name | Value |
i[se5~0+------------------------+----------+
L'X@#cHO7[ R8Y0| Key_blocks_not_flushed | 0 | #所有修改的block都已经被flush了面向PHP z? IHo0\/W Itc
| Key_blocks_unused | 0 |面向PHP?.oF.V1OOh
| Key_blocks_used | 14497 |面向PHP7^ vA S8R(W
| Key_read_requests | 38333936 |面向PHP(is7YmdUb c
| Key_reads | 207 |面向PHPyqL1ES2`+d
| Key_write_requests | 8819898 |面向PHP)e!Q{6g Ja2}x5p~
| Key_writes | 1255245 |面向PHPgt,HGV*\
+------------------------+----------+
%oE y@g+m&ZI0

`8] eYpSk`L,b0
面向PHPF.Y2fla aU V?!o

5. 需要注意的事项面向PHPR T_7a(FJ(lX8o

面向PHPeki,B'Q@J,sH}

内存中缓存的索引块(Key Cache),有时候并不会及时刷新到磁盘上,所以对于正在运行的数据表的索引文 件(MYI)一般都是不完整的。如果此时拷贝或者移动这些索引文件。多半会出现索引文件损坏的情况。

#f|/~-i;I%kQD0

;uV7cw#B7c0可以通过Flush table命令来将Key Cache中的block都flush到磁盘上。所以,一般要动态移动MyISAM表需要执行以下步骤:

e;H*ySeJ$]OH0 面向PHPE;P.w0Dtr&y2|7S

首先,刷新数据表,并锁住数据表:(注意,请不要在业务高峰期执行面向PHPR TO'Q9y0wN


9e0qa"Dj3h]j0FLUSH TABLES WITH READ LOCK;面向PHP-Y^9~8m o7J Hnl0Z

RY7?7DR,{/E0
面向PHP&V$Rb9iRo;Z

可以通过下面的命令来查看没有被Flush的索引块数量

PQ"r3|W ]2e0
面向PHP fA5C _T,d)?'[y:Aj
mysql> show status like "Key_blocks_not_flushed";
D.O D#`}R0+------------------------+----------+
4| _yD Vt$P,ip0| Variable_name | Value |
"T`8F(r:~0+------------------------+----------+
anE(D\D+Q:l2b0| Key_blocks_not_flushed | 0 |
/W%D uX'F)H6Q+J;S0+------------------------+----------+面向PHP'Cxb2NSs

4a0Nv2O[xe.e'~\s0
面向PHPyOD q|.c4Vx6@

最后,移动对应的文件(MYI MYD FRM)。

R(aig3?G7{!Ly0 面向PHP'LRgf WA+iez

参考

TX.k8KQBG0s_0
  1. MySQL Manual about Key cache
TAG: Cache Key MyISAM 详解
顶:9 踩:10
对本文中的事件或人物打分:
当前平均分:-0.57 (40次打分)
对本篇资讯内容的质量打分:
当前平均分:-0.86 (28次打分)
【已经有33人表态】
9票
感动
2票
路过
5票
高兴
3票
难过
3票
搞笑
5票
愤怒
3票
无聊
3票
同情
上一篇 下一篇
发表评论

网友评论仅供网友表达个人看法,并不表明本网同意其观点或证实其描述。

查看全部回复【已有0位网友发表了看法】