0

我在用户表中有一个巨大的记录,我想以优化的方式显示此记录。我做了一个查询,但他们需要很多的执行时间(请参阅查询),我也已经在这两个表中管理索引,但严重失败(请参阅解释)。我想使用MySql优化此查询

我希望每个用户发帖量就是为什么我做了这个查询是这样的:

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

Expain enter image description here

+0

对于庞大的数据库,它可能值得预先计算帖子计数到一个单独的'users'表列并使用它而不是每次动态计算它 – zerkms

+0

我希望每个用户的帖子数,为什么我这样做这样的查询... @zerkms –

+0

我明白,你需要预先计算数据和商店,如果数据库很大,你需要经常检索 – zerkms

回答

3

它看起来像你正在做的是选择职位的计数每个用户,为所有用户。你并不需要查询包装成集从查询结果,你就应该能够通过

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中的一些总数一样,用户还有其他的总点数,总awr等数据。对于跟随的标签,我相信他们也会计算每个标签有多少个问题。不要过度使用COUNT()将会成为将来的性能杀手的东西..

+0

删除我的答案和+1这更全面 – zerkms

+0

PS:不知道它是必需的,但可能是一个小记录,有时计数器不需要实时实时刷新它们,而不是通过在每次更改时执行增量/减量来进行刷新,但是以批量方式应用更改 – zerkms

+0

@Zerkms,感谢支持和upvote。有时候,只是提供一个查询来解决一个人的解决方案(我也做了我的分享,特别是在基本查询上)。然而,帮助新手查询和更好的结构化,规范化和存储的聚合物可以帮助他们长期更好地思考他们的问题...... – DRapp