2012-11-30 101 views
0

我正試圖在MySQL中編寫一個存儲過程。對於複雜的原因,我有一堆彙總查詢的連接來看看對象ID,然後做另一個查詢更多的連接(包括相同的表),以獲得一些數據MySQL存儲過程,內存臨時表太慢?

所以,這樣的事情:

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.o WTH?

所以我的問題是如何跳過這個臨時表的創建,只是通過ID列表?

此外,如果我將整個第一次選擇作爲子選擇移動到第二次選擇,那麼整個過程將花費更長的時間。一分鐘以上,我放棄等待。

+0

你看過/試過'UNION'嗎?或者,也許我錯過了臨時表的原因... – Benjam

+0

我不明白這會有什麼幫助。 – McTrafik

+0

也許需要澄清一下,因爲我不確定我是否理解你正在嘗試做什麼。 – Benjam

回答

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 

和顯示性能結果。

+0

你的意思是JOIN child on child.id = parents.max_id當然? – McTrafik

+0

是的,我已經糾正了這一點,thanx指出了這一點 – piotrekkr

+0

再次混淆。內部選擇需要與孩子加入,否則我不能調用MAX(child.id)。 – McTrafik