N行后的MySQL更新

时间:2014-11-10 09:11:05

标签: mysql sql performance sql-update limit

我需要更新除前1000条记录之外的表格。我的查询是这样的:

UPDATE tableA 
SET price = 100 
WHERE price = 200 AND
      item_id =12 AND 
      status NOT IN (1,2,3);

我知道子查询approcah将在这里工作,但我有一个巨大的表,其中200000条记录满足WHERE条件,并且它正在增长。所以我认为如果我遵循子查询方法,它将不会随着DB的增长而扩展。

此外,我在LIMIT查询中看到了UPDATE,但它达到了一定的限制。在我的情况下,它是在一定的偏移后,应更新所有记录。

还可以找到总计数并使用LIMIT指定它。但是COUNT()查询失败了。

2 个答案:

答案 0 :(得分:1)

您可以使用用户定义的变量:

SET @X = (SELECT ID FROM tableA 
    WHERE price = 200 AND item_id =12 AND status NOT IN (1,2,3) 
    ORDER BY ID LIMIT 1000,1 );
UPDATE tableA SET price = 100 
    WHERE price = 200 AND item_id =12 AND status NOT IN (1,2,3) 
    AND ID>@X;

是的,你需要一些方法来定义“前N行是什么”。用户定义的变量为您提供了更多选项。如果你不能在某些选择查询中有效地做到这一点,你需要考虑如何重做这样的表的一些方法。也许不同的索引方法,拆分表,缓存一些值等等。

答案 1 :(得分:0)

我不确定这是否是一个正确的解决方案,但如果您的表中有一个唯一的ID列;例如,我们可以说ID,然后您可以非常轻松地放置谓词WHERE ID > 1000。这将只考虑第1001位的行,如

UPDATE tableA SET price = 100 
WHERE price = 200 
AND item_id = 12
AND ID > 1000