mysql用一个语句更新数千行

时间:2015-09-04 15:52:33

标签: php mysql

我有一个表,其中有超过200,000行,并且正在增长,需要在给定的时间间隔进行更新。

我过去常常为每个循环执行一次,直到最近才开始工作。现在我收到了PHP超时问题。

更新非常简单。它使用行的唯一ID并更新数量。

我查看了使用CASE,但似乎可以更新的行数有限制。

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:0)

嗯,这是在黑暗中刺伤。你提到"更新数量"。你可以采取几种角度。

  1. 在您的代码中,确定有多少独特的"数量"你必须更新。

    假设您有200K产品需要更新,但库存水平往往会保持在0到50之间。

    然后你只有大约50个SQL语句。但是,它们可能附带了相当大的连接IN语句。 FOR循环的内容看起来像这样:

    $s = "update myTable set quantity = 10 where id in (124,1215,1232,4444,4532,46789);";
    $r = $db->query( $s );
    
  2. 另一种方法是拥有数据的本地副本,以及 仅为数量有的产品提交增量 自更新以来实际发生了变化也就是说,对于所有产品而言 已增加1,连接产品ID,并执行:

    $s="UPDATE myTable SET quantity = (quantity + 1) WHERE id IN (124,1215,1232,4444,4532,46789)";
    
    $r = $db->query( $s );
    
  3. 制作这些连接的IN语句并不是非常困难。假设我们有$ array_of_ids_that_went_up_by_5:

    $in_statement = "( ".implode(",",$array_of_ids_that_went_up_by_5)." );
    

    你可能需要从头到尾rtrim()一个逗号。

    应该比200K SQL语句更有效率。