我想搞一个从130 0000 0000 到 159 9999 9999的数据库。运行了一夜,才到132 5999 9999了。太慢了吧。 set_time_limit(0); $m='';
 $pdo = new PDO("sqlite:t.db");
 
 for($a=3;$a<=5;$a++){
   for($b=0;$b<=9;$b++){
     for($c=0;$c<=9;$c++){
       for($d=0;$d<=9;$d++){
          for($e=0;$e<=9;$e++){
            $pdo->beginTransaction();
            for($f=0;$f<=9;$f++){
              for($g=0;$g<=9;$g++){
                for($x=0;$x<=9;$x++){
                  for($y=0;$y<=9;$y++){
                    for($z=0;$z<=9;$z++){
                       $m = '1'.$a.$b.$c.$d.$e.$f.$g.$x.$y.$z;
                       $n = md5($m);
                       $sql = "insert into mobile(m,c)values('".$m."','".$n."')";
                       $pdo->prepare($sql)->execute();
                    }
                  }
                }
              }
            }
            $pdo->commit();
          }
       }
     }
   }
 }
 
 echo $i.'<hr>access';各路高手,请支个招,让效率顶上去。

解决方案 »

  1.   

    把循环嵌套弄少点
    0~99999999 循环三次就行了,转字符串,补齐0后加上"13"、"14"、"15"前缀即可不要每次循环都prepare,你这样还要prepare做啥?
    prepare一次,然后execute的时候传递参数即可
    $stm = $pdo->prepare("insert into mobile(m,c)values(?,?)";);
    for ()
    {
    ....
    $stm->execute(array($m,$n));
      

  2.   


    把你的sql语句改为:
    $sql = "insert into mobile(m,c) values('".$m."','".$n."'),values('".$m."','".$n."'),values('".$m."','".$n."'),values('".$m."','".$n."')";
    这种形式的,也就是一次批量插入。也可以提高点效率
      

  3.   

    楼下继续讨论,在网上搜索到一个家伙说启用事务后,几十万数据才2秒呀。它是用.net写的。请问用PHP可以做到吗???
      

  4.   


    <?php
    $step=100;
    $x=0;
    $value="";
    $sql = "insert into mobile(m,c)";
    for($i=13;$i<=15;$i++){
    for($z=0;$z<=999999999;$z++){
    $value .= (empty($value)?" ":",")."values('".$m."','".$n."')";
    $x++;
    if($x>=$step){
    mysql_query($sql.$value);
    $x=0;$value="";
    }
    }
    }
    ?>
      

  5.   

    貌似mysql里没有事务,mssql里有。
    不过要想再提高效率,就最好用存储过程来做。
    减少php与mysql之间的数据传输量。
    存储过程也是mysql localhost执行,php只是调用。
    你插入的似乎是手机号码,不明白为什么要这样做,说说需求,或许有更好的解决办法
      

  6.   

    @@dingsongtao也没有什么需求,只是想把从130开头的手机号到159的所有手机号码存储起来。我的程序,跑了一夜都没有跑完,结果我强行终止了。@@tabris17
    prepare一次,然后execute的时候传递参数即可这样可以提高效率吗???
    继续讨论!
      

  7.   

    用了PDO就用7楼8楼的方法,相信效率会好很多。
      

  8.   

    SQLIE不支持这样的表达好像。
    上次试过。
      

  9.   

    按照正常速度计算, sqlite每秒10万条插入,
    只需要插入后9位, 一共10亿条数据.
    3个小时不到.
    分 13,14,15 3个2位前缀, 3次插入
    总计大约8个小时.btw:楼主超级深的循环可以省省 ⊙﹏⊙‖