首页 > 解决方案 > 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 |

问题:例如,如果您想使用 排序likeCountORDER BY则还必须同时为每个单独的帖子生成 likeCount,这对于包含数千个帖子的非常大的表来说尤其成问题。例如,我碰巧在一个包含大约 2000 个帖子的表中调用最多需要 10 秒,这当然太慢了。

你怎么能解决这个问题?如何按 likeCount 排序,而不必为每个单独的帖子查询 likeCount,但仍然根据帖子的点赞数对帖子进行排序?

我很感激任何帮助!

标签: mysqldatabase

解决方案


相关子查询可以重写为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;

SQLFiddle 演示


推荐阅读