mysql delayed 延迟插入和参数DELAY_KEY_WRITE

本文详细介绍了MySQL中的DELAYED插入操作及其工作原理,包括队列管理、读取与插入交互以及注意事项。同时,阐述了DELAY_KEY_WRITE参数在表关闭时更新索引与数据缓存的关系,以及其在处理大量更新操作时的优势。

mysql delayed 延迟插入


DELAYED 的使用
使用延迟插入操作
DELAYED调节符应用于INSERT和REPLACE语句。当DELAYED插入操作到达的时候,
服务器把数据行放入一个队列中,并立即给客户端返回一个状态信息,这样客户
端就可以在数据表被真正地插入记录之前继续进行操作了。如果读取者从该数据
表中读取数据,队列中的数据就会被保持着,直到没有读取者为止。接着服务器
开始插入延迟数据行(delayed-row)队列中的数据行。在插入操作的同时,服务器
还要检查是否有新的读取请求到达和等待。如果有,延迟数据行队列就被挂起,
允许读取者继续操作。当没有读取者的时候,服务器再次开始插入延迟的数据行。
这个过程一直进行,直到队列空了为止。
几点要注意事项:
· 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意外停止,则所有没有被写入磁盘的行都会丢失。 



MySQL参数DELAY_KEY_WRITE的相关知识是本文我们主要要介绍的内容,DELAY_KEY_WRITE是指在表关闭之前,将对表的update操作指跟新数据到磁盘,而不更新索引到磁盘,把对索引的更改记录在内存。这样MyISAM表可以使索引更新更快。在关闭表的时候一起更新索引到磁盘。

使用:create table的时候,指定DELAY_KEY_WRITE。

当表已经存在的时候:ALTER TABLE table_name DELAY_KEY_WRITE= 1。

适用范围:表有update操作,这个参数的优势会很好的体现出来。因为这个参数能延迟更新索引到表关闭。当我们需要经常跟新一个大表的时候,可以考虑使用这个参数。

说明:表关闭会在什么时候发生?你可以理解成当flash table的时候,表将关闭。那么有2种情况将会发生flush table:

当cache 满了一个新的thread试图打开一个表的时候,那个表没有在cache;

当cache里的表数比table_cache多时thread不在使用表;

这个2种情况将会flush table。

当然,你也可以直接设置启动参数flush_time ,设置每多少时间flush table一次。

需要注意的是:当DELAY_KEY_WRITE使用的时候,如果出现重启或者掉电等情况,会导致在cache的索引update没来得及更新,所以必须在启动参数加上 --myisam-recover,这样在你启动mysql的时候会检查你的表并同步表和索引.或者在重启服务器之前运行myisamchk。(然而,即使在这种情况下,应通过使用DELAY_KEY_WRITE保证不丢失数据,因为关键字信息总是可以从数据行产生)。如果你使用该特性,你应用--myisam-recover选项启动服务器,为所有MyISAM表添加自动检查。

关于MySQL参数DELAY_KEY_WRITE的相关知识就介绍到这里了,希望本次的介绍能够对您有所收获!

### 关于 MySQL 批量插入大量数据的最佳实践 在实际生产环境中,当需要向 MySQL 数据库中插入大量的数据时,采用高效的批量插入方法能够显著提升性能并减少资源消耗。以下是针对此场景的一些最佳实践: #### 1. 使用 `INSERT ... VALUES` 的批量语法 MySQL 支持通过单条 `INSERT` 语句插入多行记录,这种方式相较于逐条插入能大幅降低网络开销事务管理成本。例如: ```sql INSERT INTO table_name (column1, column2) VALUES (value1_1, value1_2), (value2_1, value2_2), ...; ``` 这种方法允许一次性提交多组数据到数据库服务器,从而减少了客户端与服务端之间的交互次数[^1]。 #### 2. 调整 InnoDB 缓冲池配置 对于基于 InnoDB 存储引擎的应用程序来说,调整缓冲区大小(如 innodb_buffer_pool_size)可以改善磁盘 I/O 性能。较大的缓冲池意味着更多的数据可以在内存中被缓存而不是频繁访问硬盘文件系统,这对于大规模的数据加载尤其重要[^2]。 #### 3. 利用临时表进行预处理后再迁移至目标表 如果源数据非常庞大或者结构复杂,则先将其导入到一个专门创建用于中间计算过程的TEMPORARY TABLE里做必要的转换清洗等工作之后再转移到最终的目的地正式业务表当中去。这样不仅可以简化主流程逻辑而且还能有效控制整个作业期间可能产生的锁竞争等问题[^1]。 #### 4. 禁用外键约束检查(Foreign Key Checks) 在外键关系存在的情况下,默认情况下每次新增都会触发额外验证动作来确认关联对象是否存在合法状态等条件满足与否;但如果事先已经确信所准备好的待载入资料集内部相互之间没有任何违反这些规则的情况发生的话那么就可以暂时关闭这项功能以便加快速度完成整体任务进度安排如下所示命令形式即可实现该目的效果明显优于保持开启状态下继续操作下去。 ```sql SET foreign_key_checks = 0; -- 开始前禁用 -- 进行大批次插入... SET foreign_key_checks = 1; -- 结束后恢复启用 ``` #### 5. 控制每批提交的数量(Batch Size Optimization) 虽然理论上讲越少分次越好因为那样才能最大限度发挥硬件潜能但是考虑到现实世界里的各种不确定因素比如突然断电事故或者其他意外状况所以还是推荐合理规划好具体数值范围内的循环执行机制比较稳妥可靠一些通常建议设置成几百至上千级别左右为宜取决于具体情况而定当然也可以动态调节参数适应不同阶段需求变化情况作出相应调整措施加以应对解决办法多样化灵活运用才是王道[^2]。 #### 6. 合理使用延迟索引更新(Delayed Index Updates) 某些版本下的 MyISAM 类型支持选项 DELAY_KEY_WRITE ,它可以推迟直到最后才统一刷新所有更改过的二级索引节点位置信息回到物理介质上去保存起来因此在整个过程中间就不会有那么多即时同步负担累加在一起影响效率表现了不过需要注意的是只有非唯一性的普通类型才可以享受此项福利待遇哦[^1]! ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值