您的位置:首页 > 数据库 > MySQL

MySQL DELAY_KEY_WRITE

2012-01-16 16:19 106 查看
from: http://hi.baidu.com/soyah/blog/item/c31af70044362a147aec2c7d.html






插入大数据时,有索引会很慢,可以DISABLE KEYS,或者直接在table中加入DELAY_KEY_WRITE

1.

LOCK TABLES `test` WRITE;

ALTER TABLE `test` DISABLE KEYS ;

INSERT INTO `test` VALUES (1,'???',80,1),(2,'???',90,2),(1,'李四',80,3),(2,'王五',90,4),(1,'aa',12,5),(3,'aa',123,6),(4,'aadwa',123,7);

ALTER TABLE `test` ENABLE KEYS;

UNLOCK TABLES;

2.

最近天天MySQL负载经常一会高,一会低的不稳定。
整天还被perl 折腾着,晕死了。

首先, iostat -x 1看看是不是 io 瓶颈较大。
iowait 才 0.45 见鬼,多又是程序问题。
top 一下看看了 mysqld 消耗CPU非常厉害
估计又是程序问题。
用我的per程序取了下 MySQL的数据
发现 key_writes / key_write_request 几乎接近 1了。晕
说明,update,delete, insert 语句非常平凡。
最后看了 binlog 仅1小时 有个表 有1w多次 UPDATE操作,


看来需要 打开 delay_key_write 了。
这个参数只对 MyISAM有效,可以再create table 时指定 delay_key_write ,如果表已经存在可以使用 alter
table sometable delay_key_write =1;

如果你的某个表有很多update操作,这个参数的优势会很好的体现出来。因为这个参数能延迟更新索引到表关闭。
当我们需要经常跟新一个大表的时候,可以考虑使用这个参数。

那么,表关闭会在什么时候发生?你可以理解成当flash table的时候,表将关闭。那么有2种情况将会发生 flush table:

当cache 满了一个新的thread试图打开一个表的时候,那个表没有在cache;

当cache里的表数比table_cache多时thread不在使用表;

这个2种情况将会flush table。

当delay_key_write 使用的时候,如果出现重启或者掉电等情况,会导致在cache的索引update没来得及更新,所以必须在启动参数加上--myisam-recover,或者在conf设置myisam-recover=BACKUP,FORCE。这样在你启动mysql的时候会检查你的表并同步表和索引.

常用MySQL的童鞋都知道这个myisam类型的表极容易损坏,多数人可能都是用myisamchk命令来人工修复,下面介绍一种自动修复myisam的方法,也是我上午刚学的,共同进步,呵呵~

在MySQL的配置文件my.cnf中,启动项部分加入myisam-recover设置数据恢复功能,具体参数如下:

DEFAULT

与没有使用--myisam-recover选项相同。

BACKUP

如果在恢复过程中,数据文件被更改了,将tbl_name.MYD文件备份为tbl_name-datetime.BAK。

FORCE

即使.MYD文件将丢掉多个行也进行恢复。

QUICK

如果没有删除块,不要检查表中的行。

我设置了BACKUP和FORCE参数,如下:

[mysqld]

myisam-recover=BACKUP,FORCE

此参数详细情况,请参考MySQL手册http://dev.mysql.com/doc/refman/5.0/en/server-options.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: