我正在尝试在 MySQL 中编写存储过程。由于复杂的原因,我有一个带有一堆连接的聚合查询来查看对象 ID,然后使用更多连接(包括相同的表)进行另一个查询以获取一些数据
所以,像这样:
CREATE TEMPORARY TABLE ids ENGINE=MEMORY
SELECT MAX(child.id)
FROM parent
JOIN child ON child.parent_id = parent.id
WHERE
GROUP BY child.parent_id;
SELECT *
# MUST SELECT STUFF FROM PARENT, CHILD, AND STUFF JOINED ON CHILD
FROM child
JOIN parent ON parent.id = child.parent_id
# A BUNCH MORE JOINS HERE
WHERE child.id IN (SELECT * FROM ids);
DROP TEMPORARY TABLE IF EXISTS ids;
现在我注意到第一次选择需要 0.000 秒。第二次选择,如果我将 (SELECT * FROM ids) 替换为像 (1435,2352,43653,34534,...) 这样的常量列表,也需要 0.000 秒。
但是,使用临时表创建运行它们需要 0.6 秒。0.o WTH?
所以我的问题是如何跳过这个临时表创建,只传递 id 列表?
此外,如果我将整个第一个选择作为子选择移动到第二个选择,那么整个过程需要更长的时间。超过一分钟后,我放弃了等待。