【问题标题】:JOIN returns duplicated results, should I worry about that?JOIN 返回重复的结果,我应该担心吗?
【发布时间】:2012-07-12 17:11:00
【问题描述】:

我正在使用JOIN 和 MySQL 来选择一篇文章以及与之相关的所有 cmets,但我意识到,当我选择一篇文章并且有多个评论时,我会得到同一篇文章被数字重复cmets。例如:
我的表格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+ 个字符的东西,它会复制它吗?

【问题讨论】:

  • 您可能需要考虑进入此过程的总负载量 - 您可能正在尝试优化已经足够快的东西。这里似乎就是这种情况。

标签: mysql sql performance select join


【解决方案1】:

由于我为每条评论获得了相同的文章列的值, 无论如何,这会减慢 MySQL 查询或我的 Web 应用程序的速度吗?自从 我请求的数据比我真正需要的更多。

由于数据库传输的字节数超过了它所需的字节数,因此会产生与此相关的性能成本,但它可能并不明显。

我可以将查询分离为 2 个简单的 SELECT 查询,但这有点矫枉过正,对吧?

没有测量就很难说。如果 article 的值是一个 Gigabyte 而不是几个字符,那么您可能需要进行两次选择而不是一次。

【讨论】:

  • 如果我的文章栏的值更大,包含1k+个字符的东西,会不会复制它?
  • 在这种情况下我可能会做两个查询,但这是我的偏见。如果您想严格确定它是否重要,您可以进行测试以了解实际差异。
【解决方案2】:

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

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

【讨论】:

  • 真正的高负载针对性解决方案。我喜欢它。
  • 我可能会误解您的答案,但我认为将连接转换为每个表的单独数据库调用通常不是一个好的建议(除非您的 ORM 正在这样做,然后优化通常是强制加入)。
  • +1,但我不愿意在任何页面上显示超过一篇文章,因此不适用于我的网络应用程序。
【解决方案3】:

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

在这种情况下,我无法想象您还会通过抓取 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 

【讨论】:

  • 其实这就是我目前正在做的,我只是用SELECT *来提问。
  • 我明白了。好吧,所有与性能相关的事情,您都必须进行测试。
【解决方案4】:

如果分别执行两个查询,肯定会更慢。 如果在执行查询之前有“article.id”,则不需要使用JOIN。

【讨论】:

    【解决方案5】:

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

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

    如果不采用易于实现的方法 - 对整个应用程序进行性能/负载测试,找出瓶颈并解决这些问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多