INSERT INTO SELECT 非常慢,但是 INSERT 或 SELECT 单独运行时很快

问题描述 投票:0回答:2

我有这样的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'
    返回无寄存器(零),大约需要 0.004 秒。
  • INSERT INTO table1 (column1, column2) VALUES ('value', 'value')
    也需要 ~0.004 秒。

但是当我将两者组合在

INSERT INTO SELECT
语句中时,如上所示,需要大约 7.7 秒。有解释吗?还有解决办法吗?

sql database mariadb query-optimization sql-insert
2个回答
1
投票

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


1
投票

我在执行一个复杂的查询时遇到了类似的问题,该查询检索了超过 100k 行,选择速度相对较快,但插入速度非常慢。 我将问题范围缩小到插入的行数,49k 是我的最大值,插入速度很快,但 50k 行花费了 30 倍的插入时间,我通过将查询拆分为多个行查询来解决。我想说这是一个 innodb 问题(一些内部缓冲区可能会进入磁盘而不是内存),从而大大减慢插入速度。

© www.soinside.com 2019 - 2024. All rights reserved.