首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么"INSERT INTO SELECT“比INSERT慢?

"INSERT INTO SELECT"比"INSERT"慢的原因是因为它涉及到更多的操作步骤和数据处理。

"INSERT INTO SELECT"是一种将数据从一个表复制到另一个表的操作。它的步骤包括从源表中选择数据行,然后将这些数据行插入到目标表中。相比之下,"INSERT"只是将单个数据行插入到目标表中。

以下是导致"INSERT INTO SELECT"比"INSERT"慢的几个主要原因:

  1. 数据量:"INSERT INTO SELECT"通常涉及大量的数据行复制,而"INSERT"只涉及单个数据行插入。因此,在处理大量数据时,"INSERT INTO SELECT"需要更多的时间。
  2. 索引更新:目标表可能有多个索引,当执行"INSERT INTO SELECT"时,需要更新这些索引。而"INSERT"只需要更新目标表的索引。索引更新是一个相对耗时的操作,因此"INSERT INTO SELECT"比"INSERT"更慢。
  3. 日志记录:在执行"INSERT INTO SELECT"时,数据库系统需要记录复制的每个数据行,以便在需要回滚时可以还原数据。这会导致更多的日志记录操作,从而增加了执行时间。
  4. 锁定和并发性:当执行"INSERT INTO SELECT"时,源表和目标表可能需要进行锁定以保证数据的一致性。这可能会导致其他并发操作的阻塞,从而降低整体性能。

总结起来,"INSERT INTO SELECT"比"INSERT"慢的原因主要是因为它涉及更多的数据操作、索引更新、日志记录和并发性问题。在实际应用中,根据具体情况选择适当的插入方式可以提高性能和效率。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

INSERT INTO SELECT 实例

要插入的表,插入全部内容时是这样的: INSERT INTO `mapping_record` (id,mapping_record.type,sim_id,wx_id,created_time,updated_time...00013543',1511237080130,NULL,'1') 现在要把sim_id,wx_id从其他表中查询出来,然后其他列按上面的定值,再插入到mapping_record表,sql大致如下: INSERT...INTO `mapping_record` (id,mapping_record.type,sim_id,wx_id,created_time,updated_time,is_available) SELECT...以下2中从一个表复制插入到另一个表简单的情况 1、如果两个表所有的列都相同,把table1的记录复制到table2: INSERT INTO table2 SELECT * FROM table1; 2...、只复制某一列: INSERT INTO table2 (column_name(s)) SELECT column_name(s) FROM table1; 我用的是mysql数据库,Oracle也支持这种写法

33930

为什么 insert 配置 SELECT LAST_INSERT_ID() 返回个0呢?

解析的时候把 Mapper XML 中的 insert 标签语句解析出来,同时解析 selectKey 标签。最终解析完成后,把解析的语句信息使用 MappedStatement 映射语句类存放起来。...那么这里有一个非常重要的点,就是执行 insert 插入的时候,里面还包含了一句查询的操作。那也就是说,我们会在一次 Insert 中,包含两条执行语句。重点:bug就发生在这里,为什么呢?...因为最开始这两条语句执行的时候,在获取链接的时候,每一条都是获取一个新的链接,那么也就是说,insert xxx、select LAST_INSERT_ID() 在两个 connection 连接执行时...每一次都是新的链接,代码块如下; 这里的链接获取,最开始没有 if null 的判断,每次都是直接获取链接,所以这种非一个链接下的两条 SQL 操作,所以必然不会获得到正确的结果,相当于只是单独执行 SELECT...LAST_INSERT_ID() 所以最终的查询结果为 0 了就!

74830

insert into selectinsert into values区别「建议收藏」

INSERT INTO SELECT语句:从一个表复制数据,然后把数据插入到一个已存在的表中。...将一个table1的数据的部分字段复制到table2中,或者将整个table1复制到table2中, 这时候我们就要使用SELECT INTO 和 INSERT INTO SELECT 表复制语句了。...1.INSERT INTO SELECT语句 语句形式为:Insert into Table2(field1,field2,…) select value1,value2,… from Table1 或者...:Insert into Table2 select  *  from Table1 注意:(1)要求目标表Table2必须存在,并且字段field,field2…也必须存在 (2)注意Table2的主键约束...,如果Table2有主键而且不为空,则 field1, field2…中必须包括主键 (3)注意语法,不要加values,和插入一条数据的sql混了,不要写成: Insert into Table2(field1

63420

insert into select加锁规则补充

insert into select加锁规则补充 昨天的文章中,针对insert into select语句的加锁情况进行了分析: insert into A select * from B; 形如这样的语句...into table_log_new select * from table_log where time>='2020-06-04 12:30:00'; #在会话1的insert into select...into select之前,id=9999999的code值是9999999,而在执行insert into select的时候,在另外一个会话里面,对这个id=9999999的code值进行更改,在...因此可以判断: insert into A select * from B; 这个语句的row模式下,并未对表B产生全表的记录锁。 而在statement模式下,上述语句会对表B产生记录锁和间隙锁。.../ http://stackoverflow.com/questions/2640898/how-to-improve-insert-into-select-locking-behavior

2K20

insert oracle用法,insert into select的实际用法,insertselect

insert into select的实际用法,insertselect INSERT INTO SELECT语句 语句形式为:Insert into Table2(field1,field2,…) select...value1,value2,… from Table1 或者:Insert into Table2 select * from Table1 注意:(1)要求目标表Table2必须存在,并且字段field...也必须存在 (2)注意Table2的主键约束,如果Table2有主键而且不为空,则 field1, field2…中必须包括主键 (3)注意语法,不要加values,和插入一条数据的sql混了,不要写成: Insert...示例如下: 业务背景:在部分字段有变化的情况下,需要把部分数据复制插入到表里; insert into MARKETING_JUMP_MANAGE (ID,JUMP_CHANNEL,JUMP_CLASS...的实际用法,insertselect INSERT INTO SELECT 语句 语句形式为:Insert into Table2(field1,field2,…) select value1,value2

1K20

mysql insert into as_mysql insert into select使用方法详解

mysql insert into select使用方法详解2017-11-22 15:47 我们先来看看mysql insert into select的语法规则。...DELAYED被忽略INSERTSELECT。 该INSERT语句的目标表可能出现在查询部分的FROM子句中SELECT。但是,不能插入到表中并从子查询中的同一个表中进行选择。...为确保二进制日志可用于重新创建原始表,MySQL不允许并发插入INSERTSELECT语句。...为避免SELECTINSERT引用同一个表时引用不明确的列引用问题 , 请为该SELECT部分中使用的每个表提供唯一的别名,并使用适当的别名限定该部分中的列名。...由于这个问题,在MySQL 5.5.18中, INSERTSELECT ON DUPLICATE KEY UPDATE和INSERT IGNORE… SELECT语句被标记为不安全的基于语句的复制。

1.7K30

数据操纵:SELECT, INSERT, UPDATE, DELETE

73 74 HIGH_PRIORITY 将给 SELECT 语句更新一个表有更高的优先级。你只应该对非常快的或需要立即返回的查询使用它。...SELECT 句法 315 INSERT [LOW_PRIORITY] [IGNORE] [INTO] tbl_name [(column list)] SELECT ... 316 317 使用 INSERT...370 注意,如果表没有在使用中,INSERT DELAYED 将比一个正常的 INSERT 。让服务器为你使用 INSERT DELAYED 的每张表处理一个单独的线程,也是有额外的开销的。...539 540 使用 LOCAL 将比让服务器直接访问文件要一些,因为文件的内容必须从客户端主机传送到服务器主机。而在另一方面,你不再需要有 FILE 权限用于装载本地文件。...如果得到警告,并希望确切地知道为什么会得到它们,一个方法就是使用 SELECT ... INTO OUTFILE,将它保存到另外一个文件中,并与原先的输入文件进行比较。

2.3K20

MySQL的insert into select 引发锁表

运维大佬:“这个表的备份为什么要这么久,,??” 1秒过去了……2秒过去了…… 期间运营反馈系统出现大量订单超时情况。 大佬找到我,问:“你怎么备份的?”...RR,数据库版本为5.5 1.INSERT INTO SELECT insert into Table2(field1,field2,...) select value1,value2,... from...锁住了 真就锁表了~无法写进去了,我终于知道为什么订单超时了。 背锅背锅。...如果实在要使用 INSERT INTO SELECT 这种方法,可以使用下面的方法进行优化: 加条件,强制走索引,不要全表扫描,例如 INSERT INTO Table2 SELECT * FROM...其次,功能不同,INSERT INTO SELECT只是插入数据,必须先建表;CREATE TABLE AS SELECT 则建表和插入数据一块完成。

2K10
领券