mma*_*tax 7 php mysql optimization performance scalability
我有一个整数MySQL列,每次查看页面时都会增加.SQL查询看起来像这样:
UPDATE page SET views = views + 1 WHERE id = $id
当每秒多次查看同一页面(相同的id)时,我们开始遇到缩放问题(记录将锁定在MySQL中)并且查询会使MySQL陷入停顿.为了解决这个问题,我们一直在使用以下策略:
每次加载页面时,我们都会在Memcache中增加一个计数器,并将一个作业放入队列(Gearman)中,该队列将在后台更新MySQL中的计数器(在3台工作机器中).简化的代码如下所示:
在页面视图:
$memcache->increment("page_view:$id");
$gearman->doBackground('page_view', json_encode(array('id' => $id)));
Run Code Online (Sandbox Code Playgroud)
在后台工作者:
$payload = json_decode($payload);
$views = $memcache->get("page_view:{$payload->id}");
if (!empty($views)) {
$mysql->query("UPDATE page SET views = views + $views WHERE id = {$payload->id}");
$memcache->delete("page_view:{$payload->id}");
}
Run Code Online (Sandbox Code Playgroud)
这运作良好.它允许我们减少对DB的查询(因为我们在写入DB之前在memcache中聚合视图)并且DB写入在后台发生,而不是阻止页面加载.
不幸的是,我们开始再次看到MySQL锁定.似乎非常活跃的页面几乎同时运行,导致MySQL再次锁定.锁正在减慢写入速度并且经常会杀死我们的工作人员.这导致队列变得非常大,通常有70k +的作业"落后"
我的问题:接下来我们应该做些什么来扩展这个?