2013-06-28 2 views
0

У меня есть текстовый файл для чтения, который имеет около 10000 точек, разделенных, x1, y1 x2, y2 x3, y3 . . 10000 разВставка массива в базу данных MySQL непосредственно

Я прочитал их, используя цикл в 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]); 
} 
+1

Duplicated question: http://stackoverflow.com/questions/779986/insert-multiple-rows-via-a-php-array-into-mysql –

ответ

2

Попробуйте использовать несколько операторов вставки. Создать один вкладыш и представить все о

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

Существует ограничение на то, насколько большой из INSERT вы можете отправить. Возможно, вам понадобится дополнительный цикл вокруг этого. В зависимости от размера SQL, мне напоминаю, что нужно ограничить его до 3000 сгруппированных вставок, но все будут различаться. – TravisO

+0

Возможно, есть предел. В этом случае «выпустить» их на столько, сколько сможете. Несомненно, замедление происходит от синтаксического анализа SQL так много утверждений. – beiller

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), каждый раз, когда вы выполняете цикл hece вы получите в последней позиции дополнительного , и 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'); 
0

Вы должны быть в состоянии ускорить его значительно, посылая BEGIN TRANSACTION перед петлей и COMMIT после цикла. Однажды мне пришлось вставить 14 000 точек данных в SQLite, и потребовалось 20 минут, но когда я поместил данные в транзакцию, она завершилась через 0,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().

Смежные вопросы