上面有个地方写错了...下面是对的:<?php
set_time_limit(0);
require("conn.php");
$q1 = mssql_query("select id,data from chuli");
for($i = 1;$i <= mssql_num_rows($q1);$i++)
{
@mssql_data_seek($q1,$i);
$data = @mssql_fetch_array($q1);
preg_match_all("/[0-9]{1,10}包/",$data[1],$bao);
$baoshu = 0;
for($j = 0; $j <count($bao[0]); $j++)
$baoshu += intval(substr($bao[0][$j], 0, -1));
$q2 = mssql_query("update chuli set baoshu = $baoshu where id = $data[0]");
}
set_time_limit(60);
?>

解决方案 »

  1.   

    你那百万行数据中是否全部都有 `XX包` 的记录?
    如果不是的话~在MySQL内先过滤一次
      

  2.   

    mysql的sql里可以用正则查询。。
      

  3.   

    select id,data from chuli
    这样的sql语句,不慢才怪呢.
    要分段分次取.太没有效率了.
      

  4.   

    数量太多,用PHP模拟多线程执行吧,每个线程执行一部分数据。
      

  5.   

    最终发现问题出在update语句上,每次都update造成效率十分低下,处理是非常快的,一次全取出也没有占很大内存。最终的处理方案是:
    还是一次全取出来,然后每批处理100个,处理后把这100个id和$baoshu累加的写入txt文件里,结果130多万条15秒左右就处理完了,得到一个20M的txt文件,导入数据库,花了两三分钟吧。
      

  6.   

    <?php
    set_time_limit(0);
    require("conn.php");
    $fp = fopen("getbaoshu.txt",'a');
    $q1 = mssql_query("select id,data from chuli");for($i = 0;$i < mssql_num_rows($q1)/100;$i++)
    {
     $txt = "";
     for($j=0; $i<100; $i++)
     {
      mssql_data_seek($q1, $j + $i*100);
      $data = mssql_fetch_array($q1);
      preg_match_all("/[0-9]{1,10}包/",$data[1],$bao);
      $baoshu = 0;
      for($k = 0; $k <count($bao[0]); $k++)
       $baoshu += intval(substr($bao[0][$k], 0, -1));
      $txt .= $data[0]."\t".$baoshu."\r\n";
     }
     fwrite($fp,$txt);
    }
    set_time_limit(60);
    ?>
      

  7.   

    mssql_data_seek($q1, $j + $i*100); 
    这句话多余
      

  8.   

    /([0-9]{1,10})包/
    另外用括号括起来,直接取$bao[1]就可以,不用substr