在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中實現的存儲過程有多糟糕)?
請參見以下鏈接大IN子句和臨時連接表之間的性能對比。 http://explainextended.com/2009/08/18/passing-parameters-in-mysql-in-list-vs-temporary-table/ – 2011-03-22 00:37:35
感謝,該頁面是有用 – Dexter 2011-03-22 00:48:45