我有这样的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 秒。有解释吗?还有解决办法吗?
有时,当您使用 SELECT 执行 INSERT 时,性能会变慢,因为源表中的字段类型与目标表中的字段类型不同,因此当执行 INSERT-SELECT 时,会对 SELECT 中的值进行隐式转换,因此它们可以保留在命运表中。这种隐式转换并不是以最佳性能方式进行的,并且有时从值直接插入会更慢。
我在执行一个复杂的查询时遇到了类似的问题,该查询检索了超过 100k 行,选择速度相对较快,但插入速度非常慢。 我将问题范围缩小到插入的行数,49k 是我的最大值,插入速度很快,但 50k 行花费了 30 倍的插入时间,我通过将查询拆分为多个行查询来解决。我想说这是一个 innodb 问题(一些内部缓冲区可能会进入磁盘而不是内存),从而大大减慢插入速度。