Оптимизация для массовой вставки sqlPhp

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Оптимизация для массовой вставки sql

Сообщение Anonymous »

Мне нужно вставить более 100 тыс. записей в базу данных, и у меня возникли проблемы с памятью. $_data — это массив, содержащий массивы данных. Я даже увеличил объем памяти, но все равно возникли проблемы

Код: Выделить всё

// VERSION 1
protected function save() {

$memory_limit = ini_get('memory_limit');
ini_set('memory_limit', '512M');

$sql = "
INSERT INTO table (
c1,
c2,
c3,
c4,
c5,
c6,
c7,
c7,
c9,
c10,
c11
) VALUES (?,?,?,?,?,?,?,?,?)
ON DUPLICATE KEY UPDATE
c10 = VALUES(c10),
c11 = VALUES(c10),
c12 = VALUES(c12)
";
$db = Zend_Registry::get('db');
$stmt = new Zend_Db_Statement_Pdo($db, $sql);
foreach($this->_data as $entry){
$stmt->execute($entry);
}
unset($this->_data, $stmt, $sql);
ini_set('memory_limit', $memory_limit);
Второй пытается вставить все записи в мультивставку, но не лучше.

Код: Выделить всё

// VERSION 2
protected function save2(){
$question_marks = str_repeat('?,', count($this->_data[0]));
$question_marks = trim($question_marks, ',');
$question_marks = str_repeat("($question_marks),", count($this->_data));
$question_marks = trim($question_marks, ',');
$sql = "
INSERT INTO table (
c1,
c2,
c3,
c4,
c5,
c6,
c7,
c7,
c9,
c10,
c11
) VALUES $question_marks
ON DUPLICATE KEY UPDATE
c10 = VALUES(c10),
c11 = VALUES(c11),
c12 = VALUES(c12)
;";
$db = Zend_Registry::get('db');
$stmt = new Zend_Db_Statement_Pdo($db, $sql);
$insert_values = call_user_func_array('array_merge', $this->_data);
$stmt->execute($insert_values);
$affected_rows = $stmt->rowCount();
if ($affected_rows){
// @todo log
}
unset($this->_data);
unset($stmt, $sql, $insert_values, $affected_rows, $question_marks);
Имена столбцов не оригинальные.
Есть предложения?



Я попробую разбить массив данных на 5 тыс. записей и выполнить вставки в партии. Также пытаюсь посмотреть, как поможет изменение max_allowed_packet в mysql cnf.
А пока я буду признателен за любые предложения. Спасибо

ОБНОВЛЕНИЕ

в моем случае изменение max_allowed_packet от 16M до 1024M помог, и я сделал вставку без разделения массива.

Подробнее здесь: https://stackoverflow.com/questions/643 ... sql-insert
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Php»