2012-07-12 119 views
1

我使用JOIN和MySQL一起选择一篇文章以及与它相关的所有评论,但是我意识到当我选择一篇文章并且有多条评论时,我会得到与评论数量相同的文章。例如:
我有表articles有以下的列:
1. id
2. article
和工作台comments有以下的列:
1. c_id
2. body
3。 a_idJOIN返回重复结果,我应该担心这一点吗?

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 +字符,将使其自复制呢?

+0

您可能想要考虑进入的负载总量 - 您可能正试图优化速度已经足够快的事情。这似乎就是这种情况。 – 2012-07-13 15:30:32

回答

3

因为我得到了相同的文章列的值每一个评论, 这是否会减慢MySQL查询或通过反正我的web应用程序?因为 我要求更多的数据,然后我真的需要。

由于数据库正在传输比需要的更多的字节,因此存在与此相关的性能成本,但它可能不明显。

我可以将查询分隔为2个简单的SELECT查询,但这会过度杀毒吧?

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

+0

如果我的文章栏的值更大,那么包含1k +个字符的内容会如何复制? – Abdulaziz 2012-07-12 17:39:57

+0

我可能会在这种情况下做两个查询,但这是我的偏见。如果您想严格确定它的重要性,您可以测试以查看实际差异。 – 2012-07-12 17:59:13

2

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

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

+0

真正的高负荷目标解决方案。我喜欢。 – 2012-07-12 17:20:49

+0

我可能会误解你的答案,但我认为将联合转换为单独的数据库调用每个表通常不是很好的建议(除非也许你的ORM是这样做的,然后优化通常是强制联接)。 – 2012-07-12 17:24:37

+0

+1,但我不愿意在任何页面显示多个文章,所以它不适用于我的Web应用程序。 – Abdulaziz 2012-07-12 17:25:08

1

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

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

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

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 
+0

其实,这就是我现在正在做的,我只是用'SELECT *'来解决这个问题。 – Abdulaziz 2012-07-12 17:26:24

+0

我明白了。那么,所有与性能有关的东西,你都必须测试。 – 2012-07-12 17:45:37

1

,如果您单独执行两个查询,肯定是要慢。 如果在执行查询之前有“article.id”,则不需要使用JOIN。

相关问题