代码之家  ›  专栏  ›  技术社区  ›  Utku Dalmaz

无法更新超过10000条记录的mysql表

  •  0
  • Utku Dalmaz  · 技术社区  · 14 年前

    我的密码在这里

    $query = "SELECT * FROM `table`";
    $result = mysql_query($query);
     $arr = array();
     while($info = mysql_fetch_array($result)) {
    
     if (!in_array($info['row'], $arr)) {
     $arr[] = $info['row'];
     }
     }
    
    foreach ($arr as $v) {
     $pass = "pass";
    $query2 = "UPDATE `table` SET pass = '$pass'  WHERE row = '$v'";
    $result2 = mysql_query($query2);
    }
    

    它处理了2分钟,数据库里什么也没发生。我哪里会错呢?

    编辑:好的,我发现了我的错误。这是关于我写的生成随机通行证的代码,我没有把它包括在我的问题中。谢谢大家

    1 回复  |  直到 14 年前
        1
  •  1
  •   Michael Madsen    14 年前

    一种可能是内存不足:通过将所有行存储在一个数组中,甚至在到达更新部分之前,都需要大量内存—在这种情况下,这就充分解释了为什么看不到任何更改;脚本永远无法到达该部分。

    另一种可能是你的剧本 runs for too long 停止了。根据您的服务器配置, set_time_limit 在这种情况下可能是一种选择。

    UPDATE `table` SET pass = 'pass'
    

    因为您对select中的行没有任何条件,而且您所做的唯一过滤是不在row列中存储具有相同值的多个行—但是当您到达update传递时,您将通过row列标识每一行,这意味着它将更新row列中具有相同值的所有行。如果每一行的行值都是唯一的,则无需检查是否已看到该行;如果该行不唯一,则更新时需要不同的条件。

    如果您直接运行更新,PHP将不需要使用大量内存,MySQL也不必在更新过程中搜索每一行;它可以一次遍历所有行。除非你在这里留下一些东西,否则你最好只做一个简单的查询。