INSERT DELAYED 语法

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]

[INTO] tbl_name [(col_name,...)]

VALUES ({expr | DEFAULT},...),(...),...

[ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

或:

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]

[INTO] tbl_name

SET col_name={expr | DEFAULT}, ...

[ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

用于INSERT语句的DELAYED选项是MySQL相对于标准SQL的扩展。如果您的客户端不能等待INSERT完成,则这个选项是非常有用的。当您使用MySQL进行日志编写时,这是非常常见的问题。您也可以定期运行SELECT和UPDATE语句,这些语句花费的时间较长。

当一个客户端使用INSERT DELAYED时,会立刻从服务器处得到一个确定。并且行被排入队列,当表没有被其它线程使用时,此行被插入。

使用INSERT DELAYED的另一个重要的好处是,来自许多客户端的插入被集中在一起,并被编写入一个块。这比执行许多独立的插入要快很多。

使用DELAYED时有一些限制:

INSERT DELAYED仅适用于MyISAM, MEMORY和ARCHIVE表。对于MyISAM表,如果在数据文件的中间没有空闲的块,则支持同时采用SELECT和INSERT语句。在这些情况下,基本不需要对MyISAM使用INSERT DELAYED。

INSERT DELAYED应该仅用于指定值清单的INSERT语句。服务器忽略用于INSERT DELAYED...SELECT语句的DELAYED。

服务器忽略用于INSERT DELAYED...ON DUPLICATE UPDATE语句的DELAYED。

因为在行被插入前,语句立刻返回,所以您不能使用LAST_INSERT_ID()来获取AUTO_INCREMENT值。AUTO_INCREMENT值可能由语句生成。

对于SELECT语句,DELAYED行不可见,直到这些行确实被插入了为止。

DELAYED在从属复制服务器中被忽略了,因为DELAYED不会在从属服务器中产生与主服务器不一样的数据。

注意,目前在队列中的各行只保存在存储器中,直到它们被插入到表中为止。这意味着,如果您强行中止了mysqld(例如,使用kill -9)或者如果mysqld意外停止,则所有没有被写入磁盘的行都会丢失。

以下详细描述了当您对INSERT或REPLACE使用DELAYED选项时会发生什么情况。在这些描述中,“线程”指的是已接受了一个INSERT DELAYED语句的线程,“管理程序”指的是为某个特定的表处理所有INSERT DELAYED语句的线程。

当一个线程对一个表执行DELAYED语句时,会创建出一个管理程序线程(如果原来不存在),对用于本表的所有DELAYED语句进行处理。

线程会检查是否管理程序以前已获取了DELAYED锁定;如果没有获取,则告知管理程序线程进行此项操作。即使其它线程对表有READ或WRITE锁定,也可以获得DELAYED锁定。但是管理程序会等待所有的ALTER TABLE锁定或FLUSH TABLE锁定,以确保表的结构是最新的。

线程执行INSERT语句,但不是把行写入表中,而是把最终行的拷贝放入一个由管理程序线程管理的队列中。线程会提示出现语法错误,这些错误会被报告到客户端中。

因为在插入操作之前,INSERT返回已经完成,所以客户端不能从服务器处获取重复记录的数目,也不能获取生成的行的AUTO_INCREMENT值。(如果您使用C API,则出于同样的原因,mysql_info()函数不会返回任何有意义的东西。)

当行被插入表中时,二进制日志被管理程序线程更新。在多行插入情况下,当第一行被插入时,二进制日志被更新。

每次delayed_insert_limit行被编写时,管理程序会检查是否有SELECT语句仍然未执行。如果有,则会在继续运行前,让这些语句先执行。

当管理程序的队列中没有多余的行时,表被解锁。如果在delayed_insert_timeout时间内,没有接收到新的INSERT DELAYED语句,则管理程序中止。

如果在某个特定的管理程序队列中,有超过delayed_queue_size的行未被执行,则申请INSERT DELAYED的线程会等待,直到队列中出现空间为止。这么做可以确保mysqld不会把所有的存储器都用于被延迟的存储队列。

管理程序线程会显示在MySQL进程清单中,其命令列中包含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。

mysql delayed_MySQL INSERT DELAYED相关推荐

  1. mysql delayed_Mysql INSERT DELAYED语法

    INSERT DELAYED ... 用于INSERT语句的DELAYED选项是MySQL相对于标准SQL的扩展.如果您的客户端不能等待INSERT完成,则这个选项是非常有用的.当您使用MySQL进行 ...

  2. mysql delayed_mysql insert的几点操作(DELAYED,IGNORE,ON DUPLICATE KEY UPDATE )

    mysql insert的几点操作(DELAYED,IGNORE,ON DUPLICATE KEY UPDATE ) 更新时间:2010年04月14日 13:46:04   作者: DELAYED 做 ...

  3. mysql delayed_Mysql:Delayed Replication:延迟复制

    语法很简单,意义却很重大! 16.3.10 Delayed Replication MySQL 5.7 supports delayed replication such that a slave s ...

  4. mysql delayed_mysql和mariadb支持insert delayed的问题

    分析一个开源项目,往数据库里添加日志,为了避免写入日志信息影响正常业务,日志的插入方式采用了insert delayed的方式. 打印其数据库语句,复制到mysql执行报如下错误: ERROR 161 ...

  5. mysql insert delayed_mysql insert的几点操作(DELAYED 、IGNORE、ON DUPLICATE KEY UPDATE )

    INSERT语法 INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [(col_name,...)] V ...

  6. mysql的insert语法_mysql insert 语法

    INSERT语法 INSERT [LOW_PRIORITY |DELAYED| HIGH_PRIORITY] [IGNORE] [INTO]tbl_name[(col_name,...)] VALUE ...

  7. mysql+inser+select_解析MySQL中INSERT INTO SELECT的使用

    1. 语法介绍 有三张表a.b.c,现在需要从表b和表c中分别查几个字段的值插入到表a中对应的字段.对于这种情况,可以使用如下的语句来实现: INSERT INTO db1_name (field1, ...

  8. INSERT DELAYED使用总结

    今天研究了下insert delayed这个特性. 背景 RD反馈,他有一个异步的队列缓冲表,现在在做优化,看如果用insert delayed能不能提升性能?这个业务要求呢,本来就是异步插入到数据库 ...

  9. MySQL中INSERT INTO SELECT的使用

    1. 语法介绍       有三张表a.b.c,现在需要从表b和表c中分别查几个字段的值插入到表a中对应的字段.对于这种情况,可以使用如下的语句来实现: INSERT INTO db1_name (f ...

最新文章

  1. 迪克森沉思录之做Global SAP项目的弊端
  2. GitHub遭炮轰:Copilot“抄袭”已经失控,为训练AI侵权整个社区
  3. Android发送邮件
  4. position定位说明
  5. js java自动部署_vue 自动化部署 jenkins 篇
  6. Jenkins cannot restart itself as currently configured
  7. 【转】3.4SharePoint服务器端对象模型 之 访问文件和文件夹(Part 4)
  8. python画图程序代码_少儿python编程(7)海龟画图(拓展1)
  9. 复制密钥文件到另一台服务器,使用所有ssh密钥从第三台服务器在两台服务器之间远程复制...
  10. 分布式任务调度系统xxl-job源码探究(一、客户端)
  11. python中re模块_Python中re(正则表达式)模块学习
  12. 使用缓冲流有什么好处_使用档案密集柜有什么好处?不看一看会后悔
  13. NOIP 2017 PJ
  14. 超强扒站神器:SiteSucker Pro for Mac(4.1.3多语言)
  15. 系统崩溃怎么重装系统Win10?
  16. 计算机高级语言程序的流程控制结构,汇编语言(四) - 程序结构
  17. dede织梦刀具模具类企业网站源码
  18. dma循环刷新oled屏幕
  19. 题目 1567: 超级玛丽
  20. ArcGIS栅格数据四参数七参数投影变换

热门文章

  1. 二分查找算法基本思想
  2. Linux -- Tomcat 8.5.55 版本的下载与升级
  3. 特征提取算法——LBP(Local Binary Pattern)局部二值模式学习笔记
  4. Java环境:Java相关环境
  5. Sci-learn LASSO算法进行线性回归
  6. vscode 调试 js
  7. java图片处理效率_Java图像处理库 Sanselan
  8. PyQt实现QSlider滑块鼠标点击事件
  9. 云在青天水在瓶的博客开通啦,啦啦啦啦啦
  10. 找工作时让他先交500元,应聘货车司机竟成搬运工