1

由于其复杂性,我无法向您展示我的确切问题和查询,但我会将问题简化为另一个类似的问题。

开始:

有 5 个表格,包含有关苹果、汽车、书籍、电脑和衣服的信息。上面的每个表都可以有评论,所有评论都存储在一个名为Comments(带有一user_id列)的表中。为了将这 5 个表与他们自己的注释链接起来,我必须创建 5 个其他链接表名称AppleComments、、、CarComments等等BookComments

我的查询想要从这 5 个类别类型中检索我的所有评论。

我可以想到两种方法,一种比另一种更快。

  1. 我可以将 5 个表与其链接表连接起来,然后使用注释where comments.user_id = me将所有结果合并到 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...
    
  2. 我可以使用 union all 从链接表中选择所有评论 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
    

第二个速度更快,生成的执行计划更小。

问题是,因为来自 ex 的子查询“项目”。2 实际上从数据库中选择所有评论,然后与评论表进行内部连接,我担心在处理太多行时它会表现不佳。可能是内存太大了?

现在我无法判断,因为 90% 的评论都是我的,但从每个示例的角度来看,我会说第一个是检索较少数据量(总计)的评论。

如果数据库中有 100 万条评论而我的只有 100 条评论怎么办……

谢谢。

4

1 回答 1

2

你的直觉是正确的。UNION ALL将几乎消除未来优化的机会。在加入工会之前尽你所能;第一种方法是正确的。

除了它在乞求为什么你在五个不同的表中有相似的东西,为什么你甚至在看起来是一对n的关系中有链接表的问题?带有itemtype字段的单个表是否不够?如果你有额外的数据,那么有可选的外部链接到额外的数据表,这就是我要做的......

当然,这是一个虚构的宇宙,我不知道你原来的问题:)

于 2012-12-10T01:01:37.513 回答