2011-03-21 61 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