如何提高sql INSERT INTO速度

问题描述:

<?phph 
$Q=mysql_query("SELECT case_number,boxes FROM master"); 
    while($arr=mysql_fetch_array($Q)) 

    { 

      $s=trim($arr['case_number']); 

      $noc=trim($arr['boxes']) ; 

      $e=($s+$noc-1); 


     for($x=$s;$s<=$e;$s++) 
      { 


        mysql_query("INSERT INTO master_break (case_number) VALUES('$s')"); 

        $x++; 




     } 

     }?> 
+0

这段代码应该做什么? – cairnz 2011-04-04 08:30:05

+0

我有两个表称为master和master_break。主表包含名为case_number和框的字段..我需要使用主值创建master_break表... 此查询消耗更多时间和内存。如何提高执行速度 – tharindu 2011-04-04 08:35:51

使您在一次事务中的所有插入速度显着加快。

mysql_query('START TRANSACTION', $link); 
for ($i = 0; $i < 20; ++$i) 
{ 
    mysql_query("INSERT INTO master_break (case_number) VALUES('$s')", $link); 
} 
mysql_query('COMMIT', $link); 

看到http://www.slideshare.net/jwage/doctrine-2-not-the-same-old-php-orm幻灯片52

有一两件事你可以尝试做的是批量插入。 Insert syntax支持类似:

INSERT INTO master_break (case_number) VALUES (123), (456), ... 

与越来越高的批量尝试,直到你找到适合你的。

Insert into master_break(case_number) 
(select case_number from master) 

如果您只需要独特的,添加DISTINCT:

Insert into master_break(case_number) 
    (select distinct case_number from master) 
+0

唯一明智的答案。这里不需要使用慢循环。 (但是选择周围的括号不是必需的) – 2013-02-15 23:25:03

您可以在手册中读到这一点 - 尤其是,东西约insert....selectdelayedmultiple row inserts,和禁用/启用键。

使用准备好的语句并将它们全部填入事务中。即:

$pdoHandler->beginTransaction(); 
for (whatever) { 
    $query = $pdoHandler->prepare(whatever); 
    $query->bindParam(whatever); 
    $query->execute(); 
} 
try { 
    $pdoHandler->commit(); 
} catch(PDOException $e) { 
    do whatever; 
} 

这样,你就可以安全地从SQL注入。