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 |
Number of handler threads | |
Number of rows written with INSERT DELAYED | |
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 lock或alter 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/