由于其复杂性,我无法向您展示我的确切问题和查询,但我会将问题简化为另一个类似的问题。
开始:
有 5 个表格,包含有关苹果、汽车、书籍、电脑和衣服的信息。上面的每个表都可以有评论,所有评论都存储在一个名为Comments
(带有一user_id
列)的表中。为了将这 5 个表与他们自己的注释链接起来,我必须创建 5 个其他链接表名称AppleComments
、、、CarComments
等等BookComments
。
我的查询想要从这 5 个类别类型中检索我的所有评论。
我可以想到两种方法,一种比另一种更快。
我可以将 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...
我可以使用 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 条评论怎么办……
谢谢。