Php ,仅此而已,收益不会太大,因为每次在POST中插入一行(并更新其索引),就会在另一个表中插入/或更新一个新行(并更新其索引)。当然,另一个表会小得多,但每次插入都会慢一些。我没有这方面的数据

Php ,仅此而已,收益不会太大,因为每次在POST中插入一行(并更新其索引),就会在另一个表中插入/或更新一个新行(并更新其索引)。当然,另一个表会小得多,但每次插入都会慢一些。我没有这方面的数据,php,mysql,Php,Mysql,如果它不会那么快的话,因为MySQL的数据量不是不可管理的 但是,您可以通过每X秒更新一次postcount表、每Y个用户发布插入或使用交互等等来改进这一点。在这种情况下,您可以更好地使用缓存(查询缓存、innodb缓存等),在并发插入等方面没有太多问题 正如其他人所发布的,行的最后一次更新的timestamp列可能有助于在X秒后强制更新 也许,由cron/task每隔X秒进行一次更新是一个很好的解决方案(在这种情况下,您不需要timestamp列),因为您可以利用查询缓存:启用时,mysql将

如果它不会那么快的话,因为MySQL的数据量不是不可管理的

但是,您可以通过每X秒更新一次postcount表、每Y个用户发布插入或使用交互等等来改进这一点。在这种情况下,您可以更好地使用缓存(查询缓存、innodb缓存等),在并发插入等方面没有太多问题

正如其他人所发布的,行的最后一次更新的timestamp列可能有助于在X秒后强制更新

也许,由cron/task每隔X秒进行一次更新是一个很好的解决方案(在这种情况下,您不需要timestamp列),因为您可以利用查询缓存:启用时,mysql将每个select查询存储在该缓存中,如果您重复完全相同的查询(二进制比较),并且表没有更改,然后mysql立即返回第一个结果,而不返回表。查看更多信息

结论 您有2个选项:1)通过只使用列的一个索引来优化查询,或2)使用计数创建一个新表

第一个选项更简单,可能适合您的系统。100个用户并不是那么多

第二个选项更复杂,实现起来也更复杂,只会给您带来稍好的性能

此外,您还可以通过改进Mysql服务器配置来提高系统性能。

无需新表的解决方案 通常,MySQL每个查询只使用一个索引。 在您的查询中,
select count(id)from posts where user=?
,它可以是
user
id
,但可能是
user
,因为它是where子句中的列

在这种情况下,由于两列都已编制索引,您的查询将首先使用索引为用户选择行,但需要再次搜索
id
列(使用该列的索引),以便对行进行计数,因为count()只对非空值进行计数

因此,您有2个选项(不创建新表):

  • 创建包含两列的索引
  • 仅使用“选择”对话框中的一列
  • 备选案文1。这显然是一个糟糕的选择。因此,我们使用选项2

    考虑到这一点,由于我们必须按
    用户
    进行过滤,因此我们改变了计数<代码>计数(用户)将是一个选项,但您也可以执行
    计数(1)
    。因此,更好的选择是:

    select count(1) from posts where user = ?
    
    您可以测试这两个选项,方法是让mysql解释查询,只需在它们前面加上
    explain
    。并且,为了使您的结果不受查询缓存的影响,请在所选单词后添加
    sql\u no\u cache
    。例如:

    explain select sql_no_cache count(user) from posts where user = 1
    
    explain select sql_no_cache count(id) from posts where user = 1
    
    explain select sql_no_cache count(id) from posts where user = 1
    
    比较结果。您可以检查使用了哪些索引,如果mysql创建临时表等等。您可以为不同的用户创建临时表,因为结果可能不同

    新表的解决方案 要创建一个新表,每次用户发表新文章时都会更新,仅此而已,收益不会太大,因为每次在文章中插入一行(并更新其索引),就会在另一个表中插入/或更新一个新行(并更新其索引)。当然,另一个表会小得多,但每次插入都会慢一些。我没有这方面的数据

    如果它不会那么快的话,因为MySQL的数据量不是不可管理的

    但是,您可以通过每X秒更新一次postcount表、每Y个用户发布插入或使用交互等等来改进这一点。在这种情况下,您可以更好地使用缓存(查询缓存、innodb缓存等),在并发插入等方面没有太多问题

    正如其他人所发布的,行的最后一次更新的timestamp列可能有助于在X秒后强制更新

    也许,由cron/task每隔X秒进行一次更新是一个很好的解决方案(在这种情况下,您不需要timestamp列),因为您可以利用查询缓存:启用时,mysql将每个select查询存储在该缓存中,如果您重复完全相同的查询(二进制比较),并且表没有更改,然后mysql立即返回第一个结果,而不返回表。查看更多信息

    结论 您有2个选项:1)通过只使用列的一个索引来优化查询,或2)使用计数创建一个新表

    第一个选项更简单,可能适合您的系统。100个用户并不是那么多

    第二个选项更复杂,实现起来也更复杂,只会给您带来稍好的性能


    此外,您还可以通过Mysql服务器配置的配置改进来提高系统性能。

    是否索引了
    user
    id
    ?它不应该是“慢”的@Dagon是的,不慢,但我正在尝试以我能做到的最快的方式解决这个问题,并减少CPU的使用。如果我有100个在线用户,每个人都在统计这张超过百万行的表,那么要一直统计表上的帖子,可能会降低速度。你需要多高的准确度?@JuanCarlosBrown。例如,如果一个用户有5000篇文章,它可以显示4980。。。但不是2000。在这种情况下,只要您能够确定计数的年龄,就很可能不会有任何影响,您可以放弃超过1分钟或类似时间的计数。事实上,facebook不是实时的。是否对
    user
    id
    进行了索引?它不应该是“慢”的@Dagon是的,不慢,但我正在尝试以我能做到的最快的方式解决这个问题,并减少CPU的使用。要统计所有表的帖子
    select count(id) 
    from posts 
    group by user;
    
    select count(1) from posts where user = ?
    
    explain select sql_no_cache count(user) from posts where user = 1
    
    explain select sql_no_cache count(id) from posts where user = 1
    
    explain select sql_no_cache count(id) from posts where user = 1