2015-12-12 2 views
1

У меня есть массив с именем prices, который имеет 1000 элементов, я использовал этот код, чтобы добавить их в базу данных:Как оптимизировать 1000 запросов MySQL?

for (int i = 0; i < 1000; i++) { 
    $query = "INSERT INTO TABLE data (amount) VALUES"; 
    $query .= " (" . $prices[i] . ");"; 
    mysqli_query($link, $query); 
} 

Хотя это работает, но это занимает больше, чем 15second сделать, чтобы получить, что я могу сделать, чтобы оптимизировать Это?

+4

Использовать подготовленный оператор с переменной привязки; вам нужно только подготовить заявление один раз; а затем связать и выполнить внутри цикла –

+2

^this. Подробнее: http://php.net/manual/en/mysqli.prepare.php – JimL

+0

Это может быть один запрос, добавьте значения с запятой. '(". $ prices [i]. "),'. Затем 'rtrim' последний', '. – chris85

ответ

5

С технической точки зрения, вам даже не нужен цикл. Вы можете просто вставить все значения в один массив:

$query = 'INSERT INTO data (amount) VALUES '; 
$valueSets = array_fill(0, count($prices), '(?)');//creates an array containing a (?) string for each price 
$pdo = new PDO($dsn, $user, $pass, $attr); 
$query .= implode(', ', $valueSets);//concatenate onto query string 
$stmt = $pdo->prepare($query); 
$stmt->execute($prices); 

Вот и все. Конечно, это не очень хороший способ делать вещи, так что я бы, вероятно, использовать что-то вроде этого:

$stmt = $pdo->prepare('INSERT INTO data (amount) VALUES (:price)'); 
foreach ($prices as $price) { 
    $stmt->execute([':price' => $price]); 
    $stmt->closeCursor();//optional 
} 

Или, если вы действительно хотите использовать Mysqli:

$stmt = $link->prepare('INSERT INTO data (amount) VALUES (?)'); 
$price = null; 
$stmt->bind_param('i', $price);//bind by reference 
foreach ($prices as $price) { 
    $stmt->execute();//insert price 
} 

Но если честно: это, для меня, похоже, связано с DB. Я просто поставил цены в файле CSV или что-то в этом роде, а затем запустил запрос LOAD DATA LOCAL INFILE вместо написания скрипта, чтобы вставить все значения

+0

Ну, мои цены изначально были в CSV ! Сначала этот параметр выглядит неплохо, но мой файл csv немного сумасшедший, и мне нужно запустить preg_replace() для каждой ячейки, прежде чем вставлять их в базу данных. – omidh

0

Выполнение запроса базы данных является дорогостоящей задачей. Вы должны уменьшить количество запросов. Например, вы можете вставить сразу несколько значений с таким же запросом.

INSERT INTO TABLE data (amount) VALUES ('v1'), ('v2'), ('v3') 

Помните, что настройки вашей базы данных могут ограничивать длину запроса. Таким образом, 10 запросов из 100 вставок каждый или 20 запросов из 50 вставок (20x50 = 1000) могут выполнять эту работу. И это будет намного быстрее.

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