每天,我都运行一条sql语句来设置聚合值的估计值。这是一个mysql服务器,代码如下所示:
UPDATE users
INNER JOIN (
SELECT user_id, COUNT(*) AS action_count
FROM action_log
GROUP BY user_id
) AS action_log
ON users.id = action_log.user_id
SET users.action_count = action_log.action_count
随着我的数据库的增长,这将花费更长的时间来运行,并且似乎会影响其他查询。现在的代码是这样的,在整个更新过程中,我的action\u log表上是否有一个锁?
因为这是一个估计值,不需要完全准确,所以我正在考虑将其拆分为多个sql语句。进行选择以获得每个用户的聚合计数的一个。然后对每个用户行执行单个更新。
我希望这会有帮助。跑步 EXPLAIN
在这个问题上,我没有给我太多的信息,我也不确定以这种方式分手是否真的有帮助。
1条答案
按热度按时间m4pnthwp1#
是的,它可能会抓住那把锁。如果你能把
SELECT
你的问题就会消失,就像这样:你也可以将结果转储到
#TEMP_TABLE
但我喜欢使用表变量。另一种选择是使用锁定提示,如NOLOCK
或者READPAST
或者ROWLOCK
但我不建议这样做,那样会让你陷入各种各样的麻烦。