Значение привязки PDO против вставки - PullRequest
3 голосов
/ 20 апреля 2011

Помимо преимущества экранирования значения при использовании значения связывания в PDO, есть ли разница в производительности при использовании значения связывания с несколькими значениями (подготовьте оператор один раз, но выполните несколько раз с разными значениями) вместо одного оператора вставки, напримерINSERT INTO table_name VALUES (value1, value2, value3),(value1, value2, value3),(value1, value2, value3)

Ответы [ 2 ]

2 голосов
/ 21 апреля 2011

Несколько раз тестировал себя на 100 000 записей. Для более простого сценария я использовал не INSERT INTO, а REPLACE INTO, чтобы избежать необходимости каждый раз придумывать новые ключи.

ЗАМЕНИТЬ В

Пример необработанной замены в 3 столбца REPLACE INTO table_name VALUES (value1, value2, value3),(value1, value2, value3),(value1, value2, value3)...... на 100 000 строк занял приблизительно 14сек .

НОРМАЛЬНАЯ СВЯЗЬ

Использование подготовки оператора, привязка значения и выполнение подготовленного оператора заняли около 33 секунд

foreach ($vars as $var) {
    $stmt->bindValue(':a' . $var["value1"], $var["value2"]);
    $stmt->bindValue(':b' . $var["value3"], $var["value4"]);
    $stmt->bindValue(':c' . $var["value5"], $var["value6"]);
    $stmt->execute();
}

BIND BUT 1 EXECUTE

Создание длинного оператора перед его подготовкой, привязка всех параметров и выполнение за один раз заняло 22 секунд

REPLACE INTO clientSettings(clientId, settingName, settingValue) VALUES (:a1,:b1,:c1)
(:a2,:b2,:c2)
(:a3,:b3,:c3)
(:a4,:b4,:c4)
.......

Обратите внимание, что это грубые числа, использованные для создания REPLACE INTO (где поля были удалены и вставлены) в 100 000 записей.

0 голосов
/ 20 апреля 2011

Это быстрее (для MySQL), если вы используете подготовленные операторы. Таким образом, фактический SQL анализируется один раз, а данные отправляются несколько раз - поэтому фактический уровень SQL для преобразования INSERT INTO ... не вызывается каждый раз, когда вы хотите выполнить эту конкретную вставку, он анализируется только один раз, а затем вы просто отправьте разные параметры (разные данные), которые вы хотите вставить (или выполните любую другую операцию).

Таким образом, он не только снижает накладные расходы, но и повышает безопасность (если вы используете PDO :: bindValue / param из-за правильного экранирования в зависимости от используемого драйвера / кодировки).

Короче говоря - да, ваша вставка будет быстрее и безопаснее. Но по какому краю - сложно сказать.

...