表在内部连接中的sql锁定

3wabscal  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(400)

每天,我都运行一条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 在这个问题上,我没有给我太多的信息,我也不确定以这种方式分手是否真的有帮助。

m4pnthwp

m4pnthwp1#

是的,它可能会抓住那把锁。如果你能把 SELECT 你的问题就会消失,就像这样:

DECLARE @THETABLE TABLE(
USERID INT,
TOTAL INT
)

INSERT INTO @THETABLE
SELECT user_id, COUNT(*) AS action_count
FROM action_log
GROUP BY user_id

UPDATE users
INNER JOIN (
@THETABLE
) AS action_log
ON users.id = action_log.user_id
SET users.action_count = action_log.action_count

你也可以将结果转储到 #TEMP_TABLE 但我喜欢使用表变量。另一种选择是使用锁定提示,如 NOLOCK 或者 READPAST 或者 ROWLOCK 但我不建议这样做,那样会让你陷入各种各样的麻烦。

相关问题