Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何批量更新页面视图,而不是每次加载页面_Mysql_Memcached_Optimization - Fatal编程技术网

Mysql 如何批量更新页面视图,而不是每次加载页面

Mysql 如何批量更新页面视图,而不是每次加载页面,mysql,memcached,optimization,Mysql,Memcached,Optimization,我们有一个高负载的网站,有一个论坛,它被编程为每次加载主题页面时都增加主题页面浏览量。在高峰时间,这些写入成为瓶颈,MySQL被锁定。是否有一种方法可以将页面浏览量保存在内存中,然后在单个查询中每隔一段时间(例如每分钟)更新一次 我们的堆栈是:RubyonRails 2.3.8、MySQL 5.1、Memcached、Nginx+Passenger 更新:换句话说,我不想在一分钟内对500个线程进行20000次单次更新,我只想每1分钟更新500次,每个线程更新一次。看看MongoDB。写操作相当

我们有一个高负载的网站,有一个论坛,它被编程为每次加载主题页面时都增加主题页面浏览量。在高峰时间,这些写入成为瓶颈,MySQL被锁定。是否有一种方法可以将页面浏览量保存在内存中,然后在单个查询中每隔一段时间(例如每分钟)更新一次

我们的堆栈是:RubyonRails 2.3.8、MySQL 5.1、Memcached、Nginx+Passenger


更新:换句话说,我不想在一分钟内对500个线程进行20000次单次更新,我只想每1分钟更新500次,每个线程更新一次。

看看MongoDB。写操作相当快。无需更改mysql中的任何内容

您可以创建一个具有相应的POSTID和增量计数的集合

upsert和$inc运营商


如果由Rails决定,那么逻辑可能是先选择,然后是数学,然后是插入,如下所示:

@foo = SELECT view_count FROM pages WHERE ID = '1';

@bar = @foo + 1

UPDATE pages SET view_count = @bar WHERE ID = '1';
因为没有更好的表达方式

然而,MySQL可以自己处理这个家伙

在Rails中:

records = update_sql('UPDATE pages SET view_count = view_count + 1 WHERE ID = #{@baz.id}')
“records”是受影响的行数,可用于查看它是否有效

flash[:error] = "Fail!" if !records

可能会将实际写入函数限制为每个用户每个会话一次。这使得在短时间内对同一页面的刷新和频繁重访不再发生。这个问题可能与我们必须保存的信息有关,但不是经常保存,因此,对于其他类似的情况来说,这样的限制不是一个解决方案。相比MySQL更新,它会带来多大的性能优势?请看,这取决于您的数据集和应用程序需求。最好的方法是尝试一下,而不是依赖任何统计数据。我在高负载网站上使用它在每次页面加载时提供页面浏览量,发现它的写入和读取速度都非常快。这会导致一个查询而不是两个查询,并且数据库和应用程序之间的数据传输最少。问题是,查询仍然太多(即使你只做了一次)对于一个琐碎且不太重要的问题,比如线程视图计数。这些更新会占用更重要查询的处理能力,这就是为什么我不希望在一分钟内对500个线程进行20000次更新,而是希望每1分钟只进行500次更新。按照这个逻辑,你不会无限期地形成一个等待处理的更新队列吗?如果不是的话这些是您的实际统计数据和期望结果,即每分钟创建40个批次更新,每分钟仅处理一个。在10分钟的高流量时间内,您将在接下来的5.5小时内处理390个批次更新。我认为您可能需要重新评估您正在寻找的内容,并查看是否有其他地方可以进行更新优化。不,我想的是,如果我们可以将页面浏览量保留在RAM中(例如Memcached),而不是像UPDATE forum_topics SET pageviews=pageviews+1这样的查询量增加,而是像UPDATE forum_topics SET pageviews=pageviews+45这样的批量查询,这样的查询运行频率就会降低。