【发布时间】:2015-02-05 17:42:57
【问题描述】:
我正在开发一个论坛系统 (mysql),我不确定在检索单个查询帖子、上下投票以及当前用户是否为每个帖子投票时选择哪个路径以获得更好的性能。 第一个选项是这样的:
SELECT posts.post_id, post_content, display_name,
(SELECT COUNT(post_id) FROM post_votes WHERE post_votes.post_id=posts.post_id AND post_votes.user_id='+user_id+') voted,
(SELECT COUNT(post_id) FROM post_votes WHERE post_votes.post_id=posts.post_id AND up_vote=1) upvotes,
(SELECT COUNT(post_id) FROM post_votes WHERE post_votes.post_id=posts.post_id AND up_vote=0) downvotes
FROM posts JOIN users ON users.user_id=posts.user_id WHERE parent_id ='+parent_id+' ORDER BY post_id DESC
第二个选项是用 LEFT JOIN 和 count 替换所有 count 子查询。 一种方法比另一种方法有什么优势吗?
编辑:
由于我要检索所有帖子,而不是对帖子进行分组的单行,所以我想出了这个查询(灵感来自from here):
SELECT p.post_id, post_content, display_name,
COALESCE(v.upvotes, 0) AS upvotes,
COALESCE(v.downvotes, 0) AS downvotes,
COALESCE(v.voted, 0) AS voted
FROM posts p
LEFT JOIN (
SELECT post_id,
SUM(vt.up_vote = 1) AS upvotes,
SUM(vt.up_vote = 0) AS downvotes,
MAX(IF(vt.user_id = ' + user_id + ', vt.up_vote, NULL)) voted
FROM post_votes vt
GROUP BY vt.post_id
)
v ON v.post_id = p.post_id
JOIN users ON users.user_id=p.user_id
WHERE parent_id =' + parent_id + ' ORDER BY post_id DESC
我在我的演示数据库上运行了这两种解决方案(目前很小,每个表中包含不到 100 行)并且持续时间相同。 问题是从长远来看哪一个会更快。
【问题讨论】:
-
我会选择子查询选项..
-
你告诉我。双向运行。
-
@raging Bull-thx。这个问题有一个很大的问题,但它取决于它,所以我想就这个特殊情况征求意见。
-
@rahul - 在这种情况下你为什么更喜欢子查询?
标签: mysql performance join subquery