MySQL更新花费太长时间

who*_*ami 1 mysql sql database relational-database

我们在一个表中有超过2000万条记录,并且我们尝试更新3K记录,但是这花费了7分钟以上的时间,并且没有完成,因此终止了查询。

示例查询

UPDATE TABLE_A
SET STATUS = 'PENDING'
WHERE ID IN (
  SELECT ID
  FROM TMP_TABLE_A_STATUS_FIX
);   /*took more than 7 mins and didn't complete even after that*/
Run Code Online (Sandbox Code Playgroud)

我们在临时表TMP_TABLE_A_STATUS_FIX(只有3K记录)中收集了所有需要更新的ID。

由于上述查询花费的时间太长,我们分别进行了如下更新:

UPDATE TABLE_A SET STATUS = 'PENDING' WHERE ID = 1;
UPDATE TABLE_A SET STATUS = 'PENDING' WHERE ID = 2;
UPDATE TABLE_A SET STATUS = 'PENDING' WHERE ID = 3;
.
.
.
UPDATE TABLE_A SET STATUS = 'PENDING' WHERE ID = 2999;
UPDATE TABLE_A SET STATUS = 'PENDING' WHERE ID = 3000; /*updated all 3K recordds in 0.00 secs*/
Run Code Online (Sandbox Code Playgroud)

我真的不明白IN查询出了什么问题。

有人可以解释IN在where子句中进行的更新有什么问题吗,为什么即使7分钟后也没有完成?

注-TABLE_A中的ID是主键及其索引。TABLE_A中的STATUS也已建立索引。我们删除了STATUS的索引,因为我们认为由于索引的重组可能会花费一些时间来更新索引列,但这无济于事。

sca*_*dge 5

使用in子句尝试内部连接的insetad

UPDATE TABLE_A
INNER JOIN TMP_TABLE_A_STATUS_FIX on TABLE_A.ID = TMP_TABLE_A_STATUS_FIX .ID
SET STATUS = 'PENDING';
Run Code Online (Sandbox Code Playgroud)