关于MySQL中INSERT的性能相关问题

时间:2015-12-18 14:01:32

标签: mysql

通常,如果要在条目中包含外部ID,请执行以下操作:

SELECT id FROM table_a WHERE key = :key LIMIT 1; 然后 INSERT INTO table_b (table_a_id, misc) VALUES(:id, :misc);

(我试图通过不实现特定语言来尽可能通用,因为它与任何编程语言无关)。

我想知道与此相关的性能方面的差异是什么:

INSERT INTO table_b (table_a_id, misc) VALUES((SELECT id FROM table_a WHERE key = :key LIMIT 1), :misc);

简化,我想知道MySQL中是否存在某种内置优化机制来检测SELECT中的INSERT子句并将其替换为正确的值一次,或者是否每个SELECT的{​​{1}}。

感谢您的投入。

2 个答案:

答案 0 :(得分:1)

如果您的ID必须只派生一次并在insert语句中多次使用,请像第一个示例所示单独编写它们:

select id from table_a where key = :key limit 1;
insert into table_b (table_a_id, misc) values (:id, :misc);
insert into table_b (table_a_id, misc) values (:id, :misc2);
insert into table_b (table_a_id, misc) values (:id, :misc3);

如果您使用所选ID进行一次插入,则单行只会从来电者到DB进行一次:

insert into table_b (table_a_id, misc)
select id, :misc from table_a where key = :key

您也可以按照编写

的方式insert
insert into table_b (table_a_id, misc) values (
    (select id from table_a where key = :key limit 1),
    :misc
);

答案 1 :(得分:1)

未执行任何优化。 MySQL评估插入的每个值集的子查询。在MySQL may optimize sub-queries in a SELECT中,子查询表达式未根据INSERTDML optimization上的MySQL手册进行优化。

在SELECT的上下文中

Percona asked a similar question,并得出结论,MySQL没有在那里优化它。我使用5.6在我的环境中进行了类似的测试,Percona的结论似乎也适用于INSERT