0

我有一个要读取的文本文件,它有大约 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]);
}
4

4 回答 4

2

尝试使用多个插入语句。生成一个插入并提交整个语句

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

所以:

$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);
于 2013-06-28T17:43:03.307 回答
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()and$db->commit()中。

于 2013-06-29T14:51:02.160 回答
0

您应该能够通过BEGIN TRANSACTION在循环之前和循环COMMIT之后发送来大大加快速度。有一次我必须在 SQLite 上插入 14,000 个数据点,这需要 20 分钟,但是当我将数据作为事务放入时,它在 0.3 秒内完成。

于 2013-06-29T14:42:52.467 回答
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');
于 2013-06-28T18:43:59.347 回答