0

我正在尝试在 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 列表?

此外,如果我将整个第一个选择作为子选择移动到第二个选择,那么整个过程需要更长的时间。超过一分钟后,我放弃了等待。

4

1 回答 1

1

试试这个:

SELECT *
FROM (
  SELECT parent.*, MAX(child.id) as max_id
  FROM parent 
  JOIN  child ON child.parent_id = parent.id
  WHERE -- some where cond
  GROUP BY parent.id
) as parents
JOIN  child ON child.id = parents.max_id
-- other joins

并显示性能结果。

于 2012-11-30T21:27:52.613 回答