我有一个这样的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寄存器(ZERO),耗时约0.004秒。INSERT INTO table1 (column1, column2) VALUES ('value', 'value')
也需要约0.004秒。
但是当我在一个INSERT INTO SELECT
语句中合并这两个语句时,如上所示,需要大约7.7秒。有解释吗?有解决方案吗?
2条答案
按热度按时间mu0hgdu01#
有时候执行INSERT和SELECT时性能会变慢,因为原始表中的字段类型与destiny表中的字段类型不同,所以当执行INSERT-SELECT时,会对SELECT中的值进行隐式转换,以便它们可以持久化在destiny表中。这种隐式转换并不是以最佳的性能方式进行的,并且有时候从值直接插入会变慢。
xoefb8l82#
我遇到了一个类似的问题是做一个复杂的查询,检索超过100k行,选择是相对快,但插入是极其缓慢的。我缩小了问题的数量被插入的行49k是最大的对我来说,插入是去快,但50k行需要30倍的时间插入,我通过将查询拆分为多个行查询来解决这个问题,我认为这是一个innodb问题(一些内部缓冲区可能会进入磁盘而不是内存),大大减慢了插入速度。