MySQL存储过程,内存临时表太慢了?

时间:2012-11-30 21:11:52

标签: mysql stored-procedures temp-tables

我正在尝试在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秒。第二个选择是否我用(1435,2352,43653,34534,...)等常量列表替换(SELECT * FROM ids)也需要0.000秒。

但是,使用临时表创建它们都需要0.6秒。 0.W WTH?

所以我的问题是如何跳过这个临时表创建,并只传递id列表?

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

1 个答案:

答案 0 :(得分: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

并显示效果结果。