MySQL更新耗时太长

时间:2016-07-22 04:51:52

标签: 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*/

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

由于上述查询花了太长时间,我们单独更新,如

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*/

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

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

注 - TABLE_A中的ID是主键并且已编制索引。 TABLE_A中的STATUS也被索引。我们删除了STATUS的索引,因为我们认为由于索引重组而更新索引列可能需要时间,但这没有帮助。

1 个答案:

答案 0 :(得分:4)

使用in子句的内容尝试使用内连接

UPDATE TABLE_A
INNER JOIN TMP_TABLE_A_STATUS_FIX on TABLE_A.ID = TMP_TABLE_A_STATUS_FIX .ID
SET STATUS = 'PENDING';