博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
insert select带来的问题
阅读量:6198 次
发布时间:2019-06-21

本文共 763 字,大约阅读时间需要 2 分钟。

    当使用 insert...select...进行记录的插入时,如果select的表是innodb类型的,不论insert的表是什么类型的表,都会对select的表的纪录进行锁定。对于那些从oracle迁移过来的应用,需要特别的注意,因为oracle并不存在类似的问题,所以在oracle的应用中insert...select...操作非常的常见。例如:有时候会对比较多的纪录进行统计分析,然后将统计的中间结果插入到另外一个表,这样的操作因为进行的非常少,所以可能并没有设置相应的索引。如果迁移到mysql数据库后不进行相应的调整,那么在进行这个操作期间,对需要select的表实际上是进行的全表扫描导致的所有记录的锁定,将会对应用的其他操作造成非常严重的影响。

究其主要原因,是因为 mysql 在实现复制的机制时和 oracle 是不同的,如果不进行 select 表的锁定,则可能造成从数据库在恢复期间插入结果集的不同,造成主从数据的不一致。如果不采用主从复制,关闭 binlog 并不能避免对 select 纪录的锁定,某些文档中提到可以通过设置innodb_locks_unsafe_for_binlog来避免这个现象,当这个参数设置为true的时候,将不会对select的结果集加锁,但是这样的设置将可能带来非常严重的隐患。如果使用这个binlog进行从数据库的恢复,或者进行主数据库的灾难恢复,都将可能和主数据库的执行效果不同。

因此,推荐通过设置这个参数来避免 insert...select...导致的锁,如果需要进行可能会扫描大量数据的 insert...select 操作,推荐使用select...into outfile 和 load data infile 的组合来实现,这样是不会对纪录进行锁定的。

转载地址:http://ibjca.baihongyu.com/

你可能感兴趣的文章
Ubuntu16.04安装Docker 入门
查看>>
有限算法下的技术实现路线
查看>>
启动和内核管理
查看>>
用php如何快速将字符串切分成数组
查看>>
使用distribute-list配置路由选择更新
查看>>
理解Oracle在AIX平台上的内存使用
查看>>
python类的使用
查看>>
http code 返回码
查看>>
MHA高可用部署及测试 推荐
查看>>
右键菜单管理---右键管家
查看>>
使用Putty密钥认证机制远程登录Linux
查看>>
IBM t43未知设备的问题
查看>>
交换机crc错误
查看>>
MongoDB 自动启动脚本
查看>>
linux系统中查看己设置iptables规则
查看>>
在linux中使用sar调优系统性能
查看>>
linux ,系统管理技巧
查看>>
sqlserver 获取当前时间
查看>>
【ssi】增删改查六操作小框架(五)
查看>>
centos6.4安装openssl报错out range of signed 32bit displacement
查看>>