delay_key_write

 

This option applies only to MyISAM tables. It can have one of the following values to affect handling of the DELAY_KEY_WRITE table option that can be used in CREATE TABLE statements.

 

If DELAY_KEY_WRITE is enabled for a table, the key buffer is not flushed for the table on every index update, but only when the table is closed. This speeds up writes on keys a lot, but if you use this feature, you should add automatic checking of all MyISAM tables by starting the server with the --myisam-recover-options option (for example, --myisam-recover-options=BACKUP,FORCE). See Section 5.1.3, “Server Command Options”, and Section 14.4.1, “MyISAM Startup Options”.


Another performance option in MySQL is the DELAY_KEY_WRITE option. According to the MySQL documentation the option makes index updates faster because they are not flushed to disk until the table is closed.

Note that this option applies only to MyISAM tables,

You can enable it on a table by table basis using the following SQL statement:

ALTER TABLE sometable DELAY_KEY_WRITE = 1;

This can also be set in the advanced table options in the MySQL Query Browser.

This performance option could be handy if you have to do a lot of update, because you can delay writing the indexes until tables are closed. So frequent updates to large tables, may want to check out this option.

Ok, so when does MySQL close tables?

That should have been your next question. It looks as though tables are opened when they are needed, but then added to the table cache. This cache can be flushed manually with FLUSH TABLES; but here's how they are closed automatically according to the docs:

  • When the cache is full and a thread tries to open a table that is not in the cache.
  • When the cache contains more than table_cache entries and a thread is no longer using a table.
  • FLUSH TABLES; is called.

If DELAY_KEY_WRITE is enabled, this means that the key buffer for tables with this option are not flushed on every index update, but only when a table is closed. This speeds up writes on keys a lot, but if you use this feature, you should add automatic checking of all MyISAM tables by starting the server with the --myisam-recover option (for example, --myisam-recover=BACKUP,FORCE).

So if you do use this option you may want to flush your table cache periodically, and make sure you startup using the myisam-recover option.


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

注:

delay_key_write这个参数只对myisam类型表有效
如果你某个表需要经常update操作,这个参数就很管用!
但等delay_key_write使用时,出现断电或重启时,会导致在cache的索引update没来得及更新,所以必须在启动参数加上
–myisam-recover,或者在conf设置myisam-recover=BACKUP,FORCE。这样在你启动mysql的时候会检查你的
表并同步表和索引.

另外如果修复myisam类表可以在my.cnf中mysqld段设置myisam-recover恢复功能,参数有:default,force,backup,QUICK

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

参考:

http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_delay_key_write

http://www.petefreitag.com/item/441.cfm

http://www.cnblogs.com/zhizhesky/archive/2011/08/22/2149357.html

MySQL DELAY_KEY_WRITE Option的更多相关文章

  1. mysql 有没有参数都报错“mysql: unknown option”

    报错: [root@XXXX tmp]# mysql -uroot -pmysql: unknown option '--You have new mail in /var/spool/mail/ro ...

  2. mysql 常用option

    [mysql 常用option] --host=host_name, -h host_name Connect to the MySQL server on the given host. --por ...

  3. Mysql –>EF edmx(model first)–> Sql server table

    一.mysql environment When we create an new database,first We need draw er diagram for somebody to sho ...

  4. Spark:将DataFrame写入Mysql

    Spark将DataFrame进行一些列处理后,需要将之写入mysql,下面是实现过程 1.mysql的信息 mysql的信息我保存在了外部的配置文件,这样方便后续的配置添加. //配置文件示例: [ ...

  5. Spark:读取mysql数据作为DataFrame

    在日常工作中,有时候需要读取mysql的数据作为DataFrame数据源进行后期的Spark处理,Spark自带了一些方法供我们使用,读取mysql我们可以直接使用表的结构信息,而不需要自己再去定义每 ...

  6. 在oracle配置mysql数据库的dblink

    本文介绍如何在oracle配置mysql数据库的dblink:虽然dblink使用很占资源:俗称“性能杀手”.但有些场景不得不使用它.例如公司使用数据库是oracle:可能其他部门或者CP合作公司使用 ...

  7. Mysql 5.6 MHA (gtid) on Kylin

    mha on Kylinip hostname repl role mha role192.168.19.69 mysql1 master node192.168.19.73 mysql2 slave ...

  8. MySQL/MariaDB数据库的主主复制

      MySQL/MariaDB数据库的主主复制 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.主主复制概述 1>.什么是主主复制 所谓的主主复制,说白了就是两台节点互为 ...

  9. MySQL SSL配置(mysql5.7和mysql5.6)

    专题一:mysql5.7上开启并配置ssl [root@mysqlmaster01 bin]# ./mysql_ssl_rsa_setup --datadir=/data/mysql_data1/ - ...

随机推荐

  1. Java学习笔记十四:如何定义Java中的类以及使用对象的属性

    如何定义Java中的类以及使用对象的属性 一:类的重要性: 所有Java程序都以类class为组织单元: 二:什么是类: 类是模子,确定对象将会拥有的特征(属性)和行为(方法): 三:类的组成: 属性 ...

  2. HDU暑假多校第四场J-Let Sudoku Rotate

    一.题意 Sudoku is a logic-based, combinatorial number-placement puzzle, which is popular around the wor ...

  3. HBase java API 的使用范例(增,删,查,扫描)

    编辑pom.xml <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase ...

  4. 【转】已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭

    在运用Linq to sql 或者 linq to entity等相关linq技术进行数据库访问操作时,如果发生上述异常是因为是因为.NET內部是使用DataReader作数据存取,DataReade ...

  5. C语言RL78 serial bootloader和C#语言bootloader PC端串口通信程序

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 前段时间完成的hype ...

  6. ip4addr_ntoa和不可重入函数

    在网络中,有一个转换IP地址到ASIIC字符串的函数,该函数的返回值所指向的ASIIC字符串驻留在静态内存中,所以该函数不可重入. 通俗的讲,在多任务系统中,一个任务执行在调用运行这个函数的时候,其他 ...

  7. Python 3基础教程28-内置函数

    本文介绍Python中的内置函数,Python中有很多内置的,功能强大的函数,可以帮我们解决很多问题,有些方法,根本不需要你去再次编写实现函数,你直接调用就可以.在这之前,需要介绍下,如何在windo ...

  8. java.sql.Date java.sql.Time java.sql.Timestamp 之比较

    java.sql.Date,java.sql.Time和java.sql.Timestamp 三个都是java.util.Date的子类(包装类). java.sql.Date是java.util.D ...

  9. result returns more than one elements此种错误,解决

    场景:公司产品开发完成后,接入第三方厂商,在进行接口联调的时候出现此问题.此接口报文中的每一个数据都要进行校验,有些是与已经存入产品数据库中的数据进行对比,看是否存在. 问题:在测试中,有些测试没有问 ...

  10. 杜绝网上压根没测过就乱写之 《oracle mybatis 返回自增主键 》

    面试过好多人,包括自己也属于这么一个情况: 遇到问题直接去网上查,一般都可以查到解决方案.其中也包括一些基本的面试资料的答案. 其实有很多答案也都是正确的,但是还是存在一些压根就是胡乱抄来的答案,也不 ...