Php ,仅此而已,收益不会太大,因为每次在POST中插入一行(并更新其索引),就会在另一个表中插入/或更新一个新行(并更新其索引)。当然,另一个表会小得多,但每次插入都会慢一些。我没有这方面的数据
如果它不会那么快的话,因为MySQL的数据量不是不可管理的 但是,您可以通过每X秒更新一次postcount表、每Y个用户发布插入或使用交互等等来改进这一点。在这种情况下,您可以更好地使用缓存(查询缓存、innodb缓存等),在并发插入等方面没有太多问题 正如其他人所发布的,行的最后一次更新的timestamp列可能有助于在X秒后强制更新 也许,由cron/task每隔X秒进行一次更新是一个很好的解决方案(在这种情况下,您不需要timestamp列),因为您可以利用查询缓存:启用时,mysql将每个select查询存储在该缓存中,如果您重复完全相同的查询(二进制比较),并且表没有更改,然后mysql立即返回第一个结果,而不返回表。查看更多信息 结论 您有2个选项:1)通过只使用列的一个索引来优化查询,或2)使用计数创建一个新表 第一个选项更简单,可能适合您的系统。100个用户并不是那么多 第二个选项更复杂,实现起来也更复杂,只会给您带来稍好的性能 此外,您还可以通过改进Mysql服务器配置来提高系统性能。无需新表的解决方案 通常,MySQL每个查询只使用一个索引。 在您的查询中,Php ,仅此而已,收益不会太大,因为每次在POST中插入一行(并更新其索引),就会在另一个表中插入/或更新一个新行(并更新其索引)。当然,另一个表会小得多,但每次插入都会慢一些。我没有这方面的数据,php,mysql,Php,Mysql,如果它不会那么快的话,因为MySQL的数据量不是不可管理的 但是,您可以通过每X秒更新一次postcount表、每Y个用户发布插入或使用交互等等来改进这一点。在这种情况下,您可以更好地使用缓存(查询缓存、innodb缓存等),在并发插入等方面没有太多问题 正如其他人所发布的,行的最后一次更新的timestamp列可能有助于在X秒后强制更新 也许,由cron/task每隔X秒进行一次更新是一个很好的解决方案(在这种情况下,您不需要timestamp列),因为您可以利用查询缓存:启用时,mysql将
select count(id)from posts where user=?
,它可以是user
或id
,但可能是user
,因为它是where子句中的列
在这种情况下,由于两列都已编制索引,您的查询将首先使用索引为用户选择行,但需要再次搜索id
列(使用该列的索引),以便对行进行计数,因为count()只对非空值进行计数
因此,您有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