JOIN返回重复的结果,我应该担心吗?

时间:2012-07-12 17:11:01

标签: mysql sql performance select join

我正在使用JOIN与MySQL一起选择一篇文章以及与之相关的所有评论,但我意识到,当我选择一篇文章并且对它有不止一条评论时,我会得到同样的文章重复评论数量。例如:
我的表格articles包含以下列:
1. id
2. article
表格comments包含以下列:
1. c_id
2. body
3. a_id

我尝试使用的MySQL查询:

SELECT  * FROM `articles`
JOIN`comments`
ON (`articles`.id = `comments`.a_id)
WHERE `articles`.id = 134  

这是最终结果:

id  article   c_id  body        a_id
134 Article1    2   Comment1    134
134 Article1    3   Comment2    134
134 Article1    8   Comment3    134  

所以我的问题是:因为我为每个评论获得了相同的article列的值, 这会减慢MySQL查询或我的Web应用程序吗?因为我要求更多的数据然后我真正需要的是什么 我可以将查询分成2个简单的SELECT查询,但这样会有点过分,对吧?

感谢阅读。

修改
如果article列的值更大,包含1k +字符的内容,它会复制它会怎么样?

5 个答案:

答案 0 :(得分:3)

  

因为我为每条评论都获得了同一篇文章列的价值,   这会减慢MySQL查询或我的Web应用程序吗?以来   我正在请求更多数据然后我真正需要的数据。

由于数据库传输的字节数多于其所需的字节数,因此存在与此相关的性能成本,但可能并不明显。

  

我可以将查询分成2个简单的SELECT查询,但这样会有点过分,对吧?

没有测量就很难说。如果文章的价值是千兆字节而不是几个字符,那么你可能想要做两个选择而不是一个。

答案 1 :(得分:2)

您可以在一个查询中获取要显示的所有文章,然后对所有注释WHERE comments.a_id IN (1,2,5,6,9,10)执行另一个mysql调用,然后在您的应用程序中为您正在显示的文章提取相关注释。 / p>

我认为这比在每篇文章的单独查询中获取评论更有效。

答案 2 :(得分:1)

这没关系。分成两个查询需要两次访问数据库,执行类似的查询两次等。在大多数设置中,比获取更多数据更昂贵 - 希望客户端使用的协议与数据库通信将优化这一点。 MySQL确实有use compression between client and server的选项 - 应优化传输的数据。

如果这对您的应用程序至关重要,您应该进行基准测试并选择最适合的应用程序。

如果不采用易于实现的方法 - 对整个应用程序执行perf / load测试,找出瓶颈并修复它们。

答案 3 :(得分:1)

通常最好选择比您需要的更多信息,而不必在另一个查询中返回从数据库中获取更多信息。

在这种情况下,我无法想象你通过抓取article记录也太慢了你的系统。如果您对此感到担心,请不要使用select *,而应明确调用如下列:

SELECT `comments`.c_id , `comments`.body, `comments`.a_id
FROM `articles`
    JOIN `comments` ON `articles`.id = `comments`.a_id
WHERE `articles`.id = 134 

答案 4 :(得分:1)

如果单独执行两个查询,当然会慢一些。 如果在执行查询之前有“article.id”,则不需要使用JOIN。