2011-03-21 31 views
0

High Performance MySQL 159頁上他們談分手複雜的查詢到簡單的:MyISAM表現:加入分解?

轉換

SELECT * FROM tag 
JOIN tag_post ON tag_post.tag_id=tag.id 
JOIN post ON tag_post.post_id=post.id 
WHERE tag.tag='mysql'; 

SELECT * FROM tag WHERE tag='mysql'; 
SELECT * FROM tag_post WHERE tag_id=1234; 
SELECT * FROM post WHERE post.id in (123,456,567,9098,8904); 

和排序的執行實際參加自己在你的應用程序。

我的問題是閹這是史迪威當最終的查詢與需要相匹配(實際表本身具有500K左右的條目)幾千個ID的WHERE子句這樣一個好主意。

我的意思是,會不會有很大的懲罰具有類似於

SELECT * FROM post WHERE post.id in (123,456,567, ... <a few thousand IDs here> ... ,9098,8904); 

,取代上述連接語句查詢?將這個邏輯轉移到數據庫中的存儲過程會有幫助嗎(同時考慮在MySQL中實現的存儲過程有多糟糕)?

+0

請參見以下鏈接大IN子句和臨時連接表之間的性能對比。 http://explainextended.com/2009/08/18/passing-parameters-in-mysql-in-list-vs-temporary-table/ – 2011-03-22 00:37:35

+0

感謝,該頁面是有用 – Dexter 2011-03-22 00:48:45

回答

2

加入分解是在某些情況下非常有用,但在大多數情況下,這些連接將是更快。

在你的情況,我會堅持與加入的,而不是通過在幾千ID的IN子句。

+0

能否請您解釋爲什麼加入打算要更快? – hungneox 2012-05-21 08:03:47