簡體   English   中英

內部聯接中表的SQL鎖定

[英]SQL locking of table in an inner join

每天,我都會運行一條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並沒有給我太多信息,而且我不確定以這種方式分解內容是否真的有幫助。

是的,它可能會鎖定該鎖。 如果您可以將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但是我喜歡使用表變量。 另一個選擇是使用諸如NOLOCKREADPASTROWLOCK類的鎖定提示,但我不建議這樣做,這會使您陷入其他各種麻煩。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM