0

每天,我都会运行一条 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_log 表上是否存在针对整个更新的锁定?

由于这是一个估计值,不需要完全准确,我正在考虑将其拆分为多个 SQL 语句。一种选择以获取每个用户的聚合计数。然后对每个用户行进行单次更新。

我希望这会有所帮助。运行EXPLAIN这个查询并没有给我太多信息,我不确定以这种方式分解事情是否真的有帮助。

4

1 回答 1

0

是的,它可能会抓住那个锁。如果你能分离出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

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

于 2018-08-02T14:07:17.320 回答