【问题标题】:INSERT INTO SELECT is very slow, but INSERT or SELECT are fast when running separetelyINSERT INTO SELECT 很慢,但是单独运行时 INSERT 或 SELECT 很快
【发布时间】:2021-06-07 23:34:17
【问题描述】:

我有一个这样的 SQL:

INSERT INTO table1 (column1, column2) (
    SELECT column3, column4 FROM table2 WHERE column5 = 'value'
);
  • table1 有 3,500,000 行。
  • table2 有 900,000 行。
  • SELECT column3, column4 FROM table2 WHERE column5 = 'value' 返回 NO 寄存器(零),耗时约 0.004 秒。
  • INSERT INTO table1 (column1, column2) VALUES ('value', 'value') 也需要大约 0.004 秒。

但是当我在INSERT INTO SELECT 语句中结合两者时,如上所示,大约需要 7.7 秒。有解释吗?有没有解决办法?

【问题讨论】:

  • 要插入多少行?
  • 正在插入零行,戈登。
  • 您需要向我们展示您的执行计划EXPLAIN EXTENDEDANALYZE

标签: sql database mariadb query-optimization sql-insert


【解决方案1】:

有时,当您使用 SELECT 执行 INSERT 时性能会变慢,因为源表中的字段类型与目标表中的字段类型不同,因此当执行 INSERT-SELECT 时,会隐式转换 SELECT 中的值这样它们就可以保留在命运表中。这种隐式转换不是以最佳性能方式进行的,有时直接从值插入会更慢。

【讨论】:

  • 由于 SELECT 不返回任何寄存器,我相信演员不会发生,joserobertog。
  • 结果可能为空,但如果执行的查询有处理时间,那么可能是这种情况,但在有行的情况下会发生。
  • SELECT 大约需要 0.004 秒,joserobertog。
  • 我参考了 INSERT INTO SELECT 的组合情况,时间约为 7.7 秒,其中可能存在隐式转换,而不是孤立选择。
  • column1 (bigint), column2 (longtext) := column3 (bigint), column4 (text)
猜你喜欢
  • 2012-03-11
  • 1970-01-01
  • 2012-01-23
  • 2018-11-06
  • 1970-01-01
  • 2014-03-22
  • 1970-01-01
  • 1970-01-01
  • 2014-07-17
相关资源
最近更新 更多