【问题标题】:I want this query optimized using MySql我希望使用 MySql 优化此查询
【发布时间】:2025-11-28 17:15:01
【问题描述】:

我在用户表中有一条巨大的记录,我想以优化的方式显示这条记录。我做了一个查询,但它们花费了很多执行时间(请参阅查询),而且我已经管理了两个表中的索引,但严重不成功(请参阅说明)。

我希望每个用户的帖子都算出我这样查询的原因:

SELECT 
(SELECT COUNT(up.`user_id`) FROM `users_post` up WHERE up.`user_id` = uf.`user_id`
) AS user_count 
FROM `users` uf;

展开

【问题讨论】:

  • 对于庞大的数据库,可能值得预先计算帖子数到一个单独的 users 表列中并使用它而不是每次动态计算它
  • 我希望每个用户发帖数,我为什么要这样查询...@zerkms
  • 我明白,如果数据库很大并且需要经常检索,您需要预先计算数据并存储
  • @zerkms 关于这个的任何解决方案...
  • 你为什么认为我不喜欢它?我没有投反对票(+1 让你更积极 ;-)

标签: mysql optimization query-optimization subquery full-text-search


【解决方案1】:

看起来您所做的只是为所有用户选择每个用户的帖子数。您不需要将查询包装到要查询的结果集中,您应该可以通过

SELECT user_id, count(*) as totalPosts
   from user_posts
   group by user_id

现在,如果您想要额外的用户信息与它一起标记,您可以加入用户表,例如:

SELECT users.LastName, users.FirstName, etc, user_id, count(*) as totalPosts
   from user_posts
           join users
              on user_posts.user_id = users.user_id
   group by user_id

此外,正如 zerkms 所指出的,如果您始终希望将其作为某种运行的总体总计,我强烈建议您更新您的用户表以将“totalPosts”列作为整数。然后,每当向 user_posts 表添加新条目时,它都会触发...

更新用户设置 totalPosts = totalPosts +1 其中 user_id = 发布帖子的用户 ID

然后,您不必继续重新查询总体总数。就像 S/O 上的一些总数一样,用户还有其他总分、总 awrd 等统计数据。对于随后的标签,我相信他们也可以计算每个标签有多少问题。不要在未来会成为性能杀手的事情上过度使用 COUNT()。

【讨论】:

  • 删除了我的答案并为此 +1 更全面
  • PS:不确定那里是否需要它,但可能需要注意一点,有时计数器不需要实时实际,因此不要通过对每次更改执行增量/减量来刷新它们,而是批量应用更改
  • @Zerkms,感谢您的支持和支持。有时,仅仅给出一个查询就可以解决一个人的解决方案(我也做了我的分享,特别是在基本查询上)。然而,帮助新手查询和更好的结构化、规范化以及何时存储聚合可以帮助他们长期更好地思考他们的问题......