INSERT DELAYED 句法
INSERT 语句的 DELAYED 选项是一个 MySQL 特有的选项,如果你的客户端不能等待 INSERT 的完成,这将会是很有用的。This is a common problem when you use MySQL for logging and 当你打开日志记录使用 MySQL 并且你周期性的需花费很长时间才完成的 SELECT 和 UPDATE 语句时,这将是一个很普遍的问题。DELAYED 在 MySQL 3.22.15 中被引入。它是 MySQL 对 ANSI SQL92 的一个扩展。
mysql delayed 支持 myisam 不支持 innodb
INSERT DELAYED 仅仅工作与 ISAM 和 MyISAM 表。注意,因为 MyISAM 表支持并发的 SELECT 和 INSERT,如果在数据文件中没有空闲的块,那你将很少需要对 MyISAM 表使用 INSERT DELAYED。查看章节 7.1 MyISAM 表。
当你使用 INSERT DELAYED 时,客户端将立即得到一个 OK,当表不被任何其它线程使用时,该行将被插入。
使用 INSERT DELAYED 的另一个主要的好处就是,从很多客户端来的插入请求会被打包在一起并写入一个块中。这比做许多单独的插入要快的多。
注意,当前的记录行队列是被存储在内存中的,一直到他们被插入到表中。这就意味着,如果你使用强制的方法(kill -9) 杀死 mysqld,或者如果意外地死掉,任何没有写到磁盘中的记录行队列都将会丢失!
下面详细地描述当你为 INSERT 或 REPLACE 使用 DELAYED 选项时会发生什么。在这个描述中,“线程”是遇到一个 INSERT DELAYED 命令的线程,“处理器”是处理所有对于一个特定表的 INSERT DELAYED 语句的线程。
当一个线程对一个表执行一个 DELAYED 语句时,将会创建一个处理器线程用以处理对该表的所有 DELAYED 语句,除非这样的处理器已经存在。
线程检查处理器是否已经获得了一个 DELAYED 锁;如果还没有,这告诉处理程序去获得。即使其它的线程已在表上加了一个 READ 或 WRITE 锁,也能获得 DELAYED 锁。然而,处理器将等待所有的 ALTER TABLE 锁或 FLUSH TABLES 以保证表结构是最新的。
线程执行 INSERT 语句,但是并不将记录行写到表中,它将最终的记录行的副本放到被处理器线程管理的队列中。任何语法错误都会被线程发现并报告给客户程序。
客户端不能报告结果记录行中重复次数或 AUTO_INCREMENT 值;它不能从服务器获得它们,因为 INSERT 早在插入操作被完成之前就返回了。如果你使用 C API,mysql_info() 函数也因同样的原因而不能获得任何有意义的信息。
当记录行被插入到表中时,二进制的日志文件将被处理器线程更新。对于多记录行的插入,当第一个记录行被插入时,二进制日志被更新。
当每写入 delayed_insert_limit 个记录行后,处理器检查是否仍有任何 SELECT 语句没有解决。如果是这样,处理器允许在继续之前让这些语句先执行。
当处理器发现在它的队列中没有太多的记录行时,表将被解锁。如果在 delayed_insert_timeout 秒内没有接收到新的 INSERT DELAYED 命令,处理器线程将终止。
如果在一个特定的处理器队列中已有超过 delayed_queue_size 个记录行未被解决,线程要求 INSERT DELAYED 等待,只到在队列中有可用空间。这样做是为了保证 mysqld 服务器对延迟内存队列不使用全部的内存。
处理器线程在 MySQL 进程列表中的 Command 列上显示为 delayed_insert。如果执行一个 FLUSH TABLES 命令或以 KILL thread_id 杀死它,它将会被杀死。然而,它在退出前会首先将所队列记录行保存到表中。这些期间,它将不再接收其它线程的任何新的 INSERT 命令。如果再此之后执行一个 INSERT DELAYED 命令,一个新处理器线程将会被创建。 注意,上面的意思是,如果一个 INSERT DELAYED 处理器已在运行,那么 INSERT DELAYED 命令将有比正常 INSERT 命令更高的优先级!其它的更新命令将不得不等到 INSERT DELAYED 队列被清空,杀死处理器线程(以 KILL thread_id) 或执行 FLUSH TABLES。
下列状态变量提供了有关 INSERT DELAYED 命令的信息: 变量 含义
Delayed_insert_threads 处理器线程数目
Delayed_writes 使用 INSERT DELAYED 写入的记录行的数目
Not_flushed_delayed_rows 等待被写入的记录行数目
通过发出一个 SHOW STATUS 语句或通过执行一个 mysqladmin extended-status 命令,你可以查看这些变量。
注意,如果表没有在使用中,INSERT DELAYED 将比一个正常的 INSERT 慢。让服务器为你使用 INSERT DELAYED 的每张表处理一个单独的线程,也是有额外的开销的。这就意味着,你应该在确定你的确需要它时才使用 INSERT DELAYED。
INSERT DELAYED 句法的更多相关文章
- MySQL INSERT DELAYED
INSERT DELAYED 语法 INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [(col_nam ...
- mysql和mariadb支持insert delayed的问题
分析一个开源项目,往数据库里添加日志,为了避免写入日志信息影响正常业务,日志的插入方式采用了insert delayed的方式. 打印其数据库语句,复制到mysql执行报如下错误: ERROR 161 ...
- 数据操纵:SELECT, INSERT, UPDATE, DELETE
SELECT 句法 SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] [SQL_CACHE ...
- mysql INSERT的几个语法 IGNORE|REPLACE|LOW_PRIORITY | DELAYED
INSERT IGNORE 与INSERT INTO的区别就是INSERT IGNORE会忽略数据库中已经存在 的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据.这样就可以保留 ...
- MySQL 提高Insert性能
插入一个记录需要的时间由下列因素组成,其中的数字表示大约比例: 连接:(3) 发送查询给服务器:(2) 分析查询:(2) 插入记录:(1x记录大小) 插入索引:(1x索引) 关闭:(1) 这不考虑打开 ...
- INSERT ... ON DUPLICATE KEY UPDATE Syntax
一 mybatis中返回自动生成的id 当有时我们插入一条数据时,由于id很可能是自动生成的,如果我们想要返回这条刚插入的id怎么办呢.在mysql数据中我们可以在insert下添加一个selectK ...
- INERT DELEYED、INSERT IGNORE replace into和insert区别
insert into表示插入数据,数据库会检查主键,如果出现重复会报错:replace into表示插入替换数据,需求表中有PrimaryKey,或者unique索引,如果数据库已经存在数据 ...
- MYSQL insert
准备: create table T4(X int ,Y int); 方法 1. insert [low_priority][high_priority][delayed] into table_na ...
- Mysql insert声明优化
1) 假设你同一时候从同一客户插入非常多行,使用多个值表的INSERT语句. 这比使用分开INSERT语句快(在一些情况中几倍). Insert into test values(1,2),(1 ...
随机推荐
- 学习kernel编程的建议
我把我学习kernel编程的过程介绍给大家,希望大家有个参考. 学习kernel编程需要阅读大量的kernel方面的书籍,在此我列举一下我读过的kernel书籍(按时间先后顺序),并给一些建议. 1. ...
- c#继承中的函数调用
首先看下面的代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 using System; namespace Test { public cl ...
- openssl的CRYPTO_set_locking_callback
openssl可以在多线程环境下使用,但前提是向openssl提供线程锁设施,通过CRYPTO_set_locking_callback设置. 在一些复杂软件环境环境中,可能存在多个上层模块同时使用o ...
- sdfsdf
http://www.cocoachina.com/bbs/read.php?tid-234704.html 选择工程->Build Settings -> Code Signing -& ...
- iOS添加自定义字体方法
1:获取字体文件 从各种渠道下载字体文件ttf, 网站或者从别的ipa里扣出来.(以fzltxh.ttf为例) 2:将fzltxh.ttf文件拷贝到工程中 3:在Info.plist中添加项: Fon ...
- HDU 5651 xiaoxin juju needs help 水题一发
分析:求一下组合数 首先,如果不止一个字符出现的次数为奇数,则结果为0. 否则,我们把每个字符出现次数除2,也就是考虑一半的情况. 那么结果就是这个可重复集合的排列数了. fact(n)/fact(a ...
- [Irving]SqlServer 拆分函数用法
drop function dbo.split 删除自定义函数 dbo.split 函数名 函数 dbo.splitcreate function dbo.split(@c varchar(100 ...
- QTP自传之初识
我叫QTP,全名是HP Quicktest Professional,大家都叫我小Q. 小Q生于1998年,那是一个春天(哈哈咱也是跨世纪的人才).家里人丁兴旺,兄弟众多,L(Loadrunner), ...
- mac 卸载 XCode
http://blog.csdn.net/songques/article/details/7244144
- [NOIP2011]瑞士轮
noip2011普及组第3题. 题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公平 ...