mysql - 记录行数

标签 mysql database database-design relational-database query-performance

假设我们在 MySQL 数据库中有一个表“posts”,顾名思义,它存储用户在某个社交媒体平台上的帖子。现在我想显示每个用户创建的帖子数。一个潜在的解决方案是:

从帖子中选择 COUNT(*) 个帖子 ....等等;

但至少对我来说,这看起来像是一个昂贵的查询。使用名为(number_of_posts)的列在某个表(例如统计数据)中保留记录不是更好吗?我知道在最后一个场景中,一旦创建帖子,我就必须更新表(帖子)和(统计数据)。您认为解决这个问题的最佳方法是什么?

最佳答案

类似查询

 SELECT COUNT(*), user_id
   FROM posts
  GROUP BY user_id

如果您在 user_id 列上创建索引,则能够执行索引扫描Read this 。索引扫描速度很快。所以你提出的查询就很好。 SQL 和 MySQL 就是为此类查询而设计的。

并且,查询如

 SELECT COUNT(*)
   FROM posts
  WHERE user_id = 123456

如果您有user_id索引,非常快。如果保留单独的表,则可能会节省几十微秒,也可能不会。节省的费用将难以衡量。但是,维护该表会产生服务器性能和软件维护复杂性方面的成本。

对于刚刚学习使用数据库软件的人来说,对性能的直觉通常是非常悲观的。数据库软件包需要程序员花费数千年的时间来提高性能。确实。而且,你可能无法用自己的东西超越他们。

MySQL的开发者为什么要优化这种东西呢?因此,使用 MySQL 的开发人员可以依靠它来解决您的问题,而无需做大量额外的优化工作。他们为你做到了。花时间让应用程序的其他部分正常工作。

关于mysql - 记录行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50836538/

相关文章:

mysql - 数据库设计: Two "1 to many" relationship?

mysql - SQL查询计算谁拥有最多的比赛胜利

MySQL 完全匹配就像 LIKE

Php 电子邮件表单请求信息

mysql - MYsql 中的 IF 条件没有给出正确的结果

c# - SQL 在单个查询中更新多行

database - 将 MVC4 站点上传到服务器

java - MyBatis 执行获取并基于返回值在 Xxxmapper.xml 中执行更新/插入?

mysql - 我应该删除我的 MySQL 记录,还是应该有一个标志 "is_deleted"?

postgresql - 如何在没有 FK 的情况下映射表