通常,如果要在条目中包含外部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}}。
感谢您的投入。
答案 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
中,子查询表达式未根据INSERT
和DML optimization上的MySQL手册进行优化。
Percona asked a similar question,并得出结论,MySQL没有在那里优化它。我使用5.6在我的环境中进行了类似的测试,Percona的结论似乎也适用于INSERT
。