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操作,
![](http://shared.live.com/rzvDQW1qjIikH13dsbM42g/emoticons/smile_confused.gif)
看来需要 打开 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
插入大数据时,有索引会很慢,可以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操作,
![](http://shared.live.com/rzvDQW1qjIikH13dsbM42g/emoticons/smile_confused.gif)
看来需要 打开 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
相关文章推荐
- ENGINE=InnoDB DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC详解
- hadoop context.write() 以多个字段为key
- Console.read()、Console.readline()、Console.readkey()和Console.Write()、Console.Writeline()的区别
- 1022 - Can't write; duplicate key in table '#sql-1500_26'
- 1022 can't write duplicate key in table #‘sql_XXXXX’
- Console.read()、Console.readline()、Console.readkey()和Console.Write、Console.Writeline()的意思
- MYSQL参数 DELAY_KEY_WRITE说明
- mysql 错误 Can't write; duplicate key in table
- MySQL参数DELAY_KEY_WRITE的详细说明
- 安装VMware出现Error 1406:could not write value installpath to key的解决办法
- nio SelectionKey.OP_WRITE 的问题
- Error 1406. Setup cannot write the value DisableExceptionChainValidation to the registry key \SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File
- mysql插入索引太慢 加参数delay_key_write
- 数据库报错:1022: Can't write; duplicate key in table
- 手把手教你:安装svn出现could not write value to key的错误
- VMware 安装报错:Error 1406:could not write value installpath to key
- [每日练习] write a function to find the key in a m*n matrix, where each line and column is incremental
- SetRegistryKey导致CWinApp::WriteProfileInt等操作注册表而不是INI文件
- mysql delayed 延迟插入和参数DELAY_KEY_WRITE
- 1022-Cant't write;duplicate key in table '#sql-b60_c'