由于其复杂性,我无法向您展示我的确切问题和查询,但我会将问题简化为另一个问题。
这里是:
有5张桌子,包含有关苹果,汽车,书籍,电脑和衣服的信息。上面的每个表都可以有注释,所有注释都存储在一个名为Comments
的表中(带有user_id
列)。要将这5个表与他们自己的注释相关联,我必须创建5个其他链接表名AppleComments
,CarComments
,BookComments
,等等。
我的查询想从这5个类别类型中检索我的所有评论。
我可以想到两种方式,一种比另一种更快。
我可以使用其链接表加入5个表,然后使用注释where comments.user_id = me
加入UNION ALL结果到1个结果集:
SELECT <column_names> FROM AppleComments
INNER JOIN Comments ON AppleComments.comment_id = Comments.comment_id
WHERE Comments.user_id = me
UNION ALL
SELECT <column_names> FROM CarComments
INNER JOIN Comments ON CarComments.comment_id = Comments.comment_id
WHERE Comments.user_id = me
etc...
我可以使用union all从linkin表中选择所有注释id-s,然后使用Comments
表将此子查询内部加入,以获取有关它们的其他信息。
SELECT <column_names>
FROM (
Select AppleComments.comment_id FROM AppleComments
UNION ALL
Select CarComments.comment_id FROM CarComments
UNION ALL
Select BookComments.comment_id FROM BookComments
UNION ALL
Select ComputerComments.comment_id FROM ComputerComments
UNION ALL
Select ClothesComments.comment_id FROM ClothesComments) AS items
INNER JOIN Comments ON items.comment_id = Comments.comment_id
WHERE Comments.user_id = me
第二个更快,产生更小的执行计划。
问题是,因为子查询'items'来自ex。 2实际上选择了数据库中的所有注释,然后使用comments表进行内部连接,我担心的是在处理太多行时它会表现不佳。也许记忆太多了?
现在我无法分辨,因为90%的评论都是我的,但是每个例子判断一点,我会说第一个是检索少量数据(每个总数)。
如果数据库中有100万条评论,而且只有100条评论...
感谢。
答案 0 :(得分:2)
你的直觉是正确的。 UNION ALL
几乎会消除未来优化的可能性。在结合之前尽你所能;第一种方法是正确的。
除了它提出的问题,为什么你在五个不同的表中有类似的东西,为什么你甚至有一个似乎是一对一关系的链接表?具有itemtype
字段的单个表是不够的?如果您有额外的数据,那么我可以选择外部链接到其他数据表...
当然,这是一个虚构的宇宙,我对你原来的问题一无所知:)