mysql - MySQL:通过子查询和到其他表的链接来增加表检索时间?
问题描述
以下示例:在我的数据库中,我有两个表:一个存储用户帖子及其内容,另一个存储来自这些帖子的其他用户的喜欢。如果用户喜欢帖子,则会将新行插入到喜欢表中。
如果我在帖子表上进行 SELECT 调用,它还会使用子查询( SQL Fiddle )返回相应帖子的点赞数:
SELECT allPosts.*,
(SELECT COUNT(*) FROM likes WHERE likes.postID = allPosts.id) AS likeCount
FROM posts allPosts
ORDER BY likeCount DESC
LIMIT 3;
| id | content | likeCount |
|----|---------|-----------|
| 2 | Post 2 | 2 |
| 3 | Post 3 | 1 |
| 1 | Post 1 | 0 |
问题:例如,如果您想使用 排序likeCount
,ORDER BY
则还必须同时为每个单独的帖子生成 likeCount,这对于包含数千个帖子的非常大的表来说尤其成问题。例如,我碰巧在一个包含大约 2000 个帖子的表中调用最多需要 10 秒,这当然太慢了。
你怎么能解决这个问题?如何按 likeCount 排序,而不必为每个单独的帖子查询 likeCount,但仍然根据帖子的点赞数对帖子进行排序?
我很感激任何帮助!
解决方案
相关子查询可以重写为JOIN
:
SELECT allPosts.id, allPosts.content,
COUNT(likes.postID) AS likeCount
FROM posts allPosts
LEFT JOIN likes
ON likes.postID = allPosts.id
GROUP BY allPosts.id, allPosts.content
ORDER BY likeCount DESC
LIMIT 3;