N行后的MySQL更新

标签 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);

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

我还看到在 UPDATE 查询中指定了 LIMIT 但它达到了某个限制。在我的例子中,它是在一定的偏移量之后,应该更新所有记录。

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

最佳答案

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

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 行是什么”。用户定义的变量为您提供了更多选择。如果您不能在某些选择查询中有效地做到这一点,您将需要考虑一些如何重新处理此类表的方法。也许不同的索引方法、拆分表、缓存一些值等。

关于N行后的MySQL更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26840188/

相关文章:

python - 如何从数据库列中的 python 数组中仅选择元素

php - 从phpmyadmin导入sql数据库时出错

python - 为什么这段代码在 Cython 中比在 Python 中慢?

mysql - SQL GROUP BY 返回空集

javascript - 如何创建多个动态图像 slider ? [仅使用 PHP、MySQL 和 vanilla JS! ]

sql - 将集合返回函数(json_array_elements)的结果与表列连接

mysql - 打印存储过程中插入中使用的变量列表

c# - 使用 GPU 加速 BigInteger 计算

c++ - 使用相同的 golang 片段查询 mysql 数据库的巨大性能差异

mysql - SQL服务器: How do I combine my rows distinctly