我正在使用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 +字符的内容,它会复制它会怎么样?
答案 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。