LINUX.ORG.RU

mysql, обычные вставки и использование bind_param, в чем разница ??


0

0

если верить книгам то
использование связки
$stmt = $db->prepare('insert into table(...) values(?,?,...)
+ в цикле
{
$stmt->bind_param($name, $soname);
}
$stmt->execute()

должно быть быстрее $db->query('insert into table(...) values(...)');

есть таблица на несколько тысячь строк
и что самое интерестное что оба способа дали один и тот же результат и на одной и тойже строчки
(time limit exidid 300 пришлось повысить max_execution_time)

кто расскажет, может быть я что-то не так делаю, или не понял
идеологию $stmt->bind_param ?

help ))

(ps + ко всему этому после открытия соединения с базой стоит autocommit(false);, если это имеет значение...)


Это быстрее в случае селекта и если база вообще знает, что такое подготовленный запрос. Я не очень понимаю, что это может дать при вставке данных.

svr69 ★★
()

если тебе нет разницы, и таблицы - InnoDB (хотя судя по твоим результатам - похоже на MyISAM), попробуй вырубить autocommit

gods-little-toy ★★★
()

> должно быть быстрее $db->query('insert into table(...) values(...)');

Cильно быстрее не будет. С prepared statement ты экономишь время на парсинг запроса. Парсинг одного INSERT'а - это мелочи по сравнению с записью в таблицу, обновлением индексов, и тд и тп. Prepared statement дает экономию если у тебя хитро закрученный SELECT.

> (time limit exidid 300 пришлось повысить max_execution_time) это как я понимаю сообщение от PHP? Ты сколько строчек вставляешь?

Если строчек много, можно попробовать оптимизировать с другой стороны - склеить в PHP один запрос вида

INSERT INTO table VALUES (....), (....), (....), .... (...);

и один его запустить, без prepared statement. Это может ускорить дело.

gods-little-toy ★★★
()
Ответ на: комментарий от gods-little-toy

... но только такой multi-line INSERT не поддерживается на других DBMS, в частности PostgreSQL'ем.

gods-little-toy ★★★
()
Ответ на: комментарий от gods-little-toy

спасибо что объяснили

INSERT INTO table VALUES (....), (....), (....), .... (...); - немного помогло


>Cильно быстрее не будет. С prepared statement ты экономишь время на >парсинг запроса. Парсинг одного INSERT'а - это мелочи по сравнению с >записью в таблицу, обновлением индексов, и тд и тп. Prepared statement >дает экономию если у тебя хитро закрученный SELECT.

если так то тогда я не пойму какой смысл вообще было делать
prepare statement for insert ?????

hose
() автор топика
Ответ на: комментарий от hose

>какой смысл вообще было делать prepare statement for insert ?????

Что такое SQL-иньекция знаешь?

anonymous
()
Ответ на: комментарий от hose

> если так то тогда я не пойму какой смысл вообще было делать prepare statement for insert ?????

1. см предыдущего оратора, sql injections

2. afair стандарт требует чтобы все возможные PREPARE'ились. Даже такие одноразовые как DROP TABLE и тд. Может кто-нибудь родит такую dbms, где будет какая-нибудь предобработка для INSERT'ов. Еще один довод в пользу единообразия - кроме INSERT, есть еще INSERT ... SELECT. В котором имеет смысл прооптимизировать SELECT-часть.

gods-little-toy ★★★
()
Ответ на: комментарий от gods-little-toy

Теоретический пример - INSERT может приводить к вызову триггеров. А в триггере уже есть, что предобрабатывать перед запуском. Но это, как я говорю, теория. я не в курсе делают ли реально существующие dbms'ы предобработки в таких случаях.

gods-little-toy ★★★
()

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

Pi ★★★★★
()
Ответ на: комментарий от gods-little-toy

Теоретически триггеры и хранимые процедуры хранятся уже скомпилированными и не требуют предварительного запуска оптимизатора.

svr69 ★★
()
Ответ на: комментарий от svr69

в mysql хранимки не хранятся скомпиленными. и вьюшки, кажется, тоже. prepare хорошо использовать для

1) защиты от инъекций 2) увеличения производительности, когда один и тот же запрос выполняется много раз.

Еще отмечту, что вместо bind_params гораздо удобнее делать my $sth = $dbh->prepare(...); $sth->execute( $param1, $param2 )

golubeff
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.