我有一个要读取的文本文件,其中大约有10000个点, X1,Y1 X2,Y2 X3,Y3 。 。 10000次
我在PHP中使用循环读取它们然后存储在数组中然后我运行一个循环并在我的数据库中一次插入一行。这需要很长时间。有什么方法可以插入整个数组
for ($i=0; $i<10000; $i++)
{
$sql = '
INSERT INTO `firefly`.`FreeFormPoly`
(`markedObjectID`, `order`, `x`, `y`)
VALUES
('.$markedObjectsID.', '.$order.', '.$valuesx[i].','.$valuesy[i].')';
$db->query($sql, $markedObjectsID, $order, $values[1], $values[0]);
}
答案 0 :(得分:2)
尝试使用多个insert语句。生成一个插入并提交整个语句
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
SO:
$sql = 'INSERT INTO `firefly`.`FreeFormPoly` (`markedObjectID`, `order`, `x`, `y`) VALUES';
for($i=0;$i<10000;$i++) {
if($i != 0) $sql .= ',';
$sql .= '('.$markedObjectsID.', '.$order.', '.$valuesx[i].','.$valuesy[i].')';
}
$db->query($sql);
答案 1 :(得分:0)
我会做这样的事情:
$sql = 'INSERT INTO `firefly`.`FreeFormPoly` (`markedObjectID`, `order`, `x`, `y`) VALUES';
for($i=0;$i<length;$i++) {
$sql .= '('.$markedObjectsID.', '.$order.', .$valuesx[i].','.$valuesy[i].'),';
}
$sql = substr($sql,0,-1);
$db->query($sql);
<强>解释强>
输入多条记录的语法是
INSERT INTO TABLE_NAME VALUES(VAL1,VAL2,....),(...),(...);
在SQL中,每次执行循环时都会连接(val1,val2,val3),
,你将在最后一个位置获得额外的,
并将substr()
修剪掉。
更优选我会做
$sql = 'INSERT INTO `firefly`.`FreeFormPoly` (`markedObjectID`, `order`, `x`, `y`) VALUES ';
for($i=0;$i<length;$i++) {
$sql .= '('.$markedObjectsID.', '.$order.', .$valuesx[i].','.$valuesy[i].'),';
}
$sql = substr($sql,0,-1);
$result = mysqli_query($db,$sql)
or die('Error in querying the database');
答案 2 :(得分:0)
通过在循环之前发送BEGIN TRANSACTION
并在循环之后发送COMMIT
,您应该能够大大加快速度。有一次我不得不在SQLite上插入14,000个数据点,花了20分钟,但是当我将数据作为一个事务处理时,它在0.3秒内完成。
答案 3 :(得分:0)
首先,您可以使用预准备语句来减少网络开销。假设PDO:
$stmt = $db->prepare('INSERT INTO mytable (foo, bar, baz) VALUES (:foo, :bar, :baz)');
for ($i = 0; $i < $length; ++$i) {
$stmt->execute(array(
':foo' => $data[$i]['foo'],
':bar' => $data[$i]['bar'],
':baz' => $data[$i]['baz'],
));
}
其次,您可以将整个代码包装在$db->beginTransaction()
和$db->commit()
内。