MyISAM的insert delayed

Innodb提供有insert buffer以批量操作减少IO(最新版本扩充为change buffer)MyISAM也有类似功能,称作insert delayed,即延迟提交;

延迟插入的记录保存在内存中,如果此时断电则会丢失,当新插入行不立即被查询时可用此功能提升IO

相较于普通的insert,此命令可立即获得反馈而不必等待数据实际插入表中;

 

原理

--该操作需要用到两个线程,一个是发起语句的初始线程initiator,另一个是处理线程handler

initiator调用delay语句时,系统会创建一个handler,负责处理所有该表的delay操作;

Initiator会通知handler使用delayed lock锁定被操作的表,即便该表已有read/write lock也可成功,然而handler会等待所有alter table/flush tables操作完毕后再执行;

Initiator执行insert时,会将数据行复制到handler维护的一个队列中;;

如果调用kill thread_id杀死handler进程,其在退出前会将队列中的行更新到磁盘且期间不再接受新的请求;

 

 

delayed_insert_limit用于控制写入数量,每次handler写入磁盘的数据达到此限制后会查看是否有阻塞的select操作,如果有则允许其优先执行,以避免过分阻塞读操作

delayed_insert_timeout当队列为空时,handler在等待delayed_insert_timeout规定的时间后会自动退出

delayed_queue_size用于控制队列大小(每个表可对应一个),默认100,如队列已满则initiator需要等待直到有足够空间为止

 

Status Variable

Meaning

Delayed_insert_threads

Number of handler threads

Delayed_writes

Number of rows written with INSERT DELAYED

Not_flushed_delayed_rows

Number of rows waiting to be written


此功能受max_delayed_threads限制(默认20),其规定了mysql可以使用的最大 insert delayed线程数,超过此限制的insert delayed请求自动转为普通insert操作,设置为0则禁止insert delayed功能;5.6.7后改为max_insert_delayed_threads;


限制

该命令只适用于MyISAM/Memory/Archive/Blackhole

不可用于insert  … select …/ insert … on duplicate key update

在数据被刷新到表之前不可调用last_insert_id()获取其auto_increment值;

Slave会将其转换为普通的insert,否则有可能造成与master数据不一致;

不支持视图/分区表;

若表被施加了write lockalter table操作,所有等待的insert delayed语句会丢失;

数据首先被保存在内存的一个队列中,如果此时服务器crash则数据会丢失;

 

http://dev.mysql.com/doc/refman/5.5/en/insert-delayed.html

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15480802/viewspace-755395/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/15480802/viewspace-755395/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值