如何提高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++;
}
}?>
答
使您在一次事务中的所有插入速度显着加快。
像
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
答
使用准备好的语句并将它们全部填入事务中。即:
$pdoHandler->beginTransaction();
for (whatever) {
$query = $pdoHandler->prepare(whatever);
$query->bindParam(whatever);
$query->execute();
}
try {
$pdoHandler->commit();
} catch(PDOException $e) {
do whatever;
}
这样,你就可以安全地从SQL注入。
这段代码应该做什么? – cairnz 2011-04-04 08:30:05
我有两个表称为master和master_break。主表包含名为case_number和框的字段..我需要使用主值创建master_break表... 此查询消耗更多时间和内存。如何提高执行速度 – tharindu 2011-04-04 08:35:51