Производительность в PDO / PHP / MySQL: транзакция против прямого выполнения

Я перебираю несколько значений (например, от 1 до 100) и выполняя подготовленный оператор внутри цикла.

Есть ли и преимущество использования транзакции – фиксация после окончания цикла – по сравнению с прямым выполнением внутри цикла?

Значения не зависят друг от друга, поэтому транзакция не нужна с этой точки зрения.

Если ваши запросы – INSERT, страница 7.2.19. Скорость инструкций INSERT в руководстве MySQL дает две интересные информации, в зависимости от того, используете ли вы механизм транзакций или нет:

При использовании не-транзакционного движка:

Чтобы ускорить операции INSERT, которые выполняются с несколькими операторами для таблиц без транзакций, заблокируйте свои таблицы.

Это повышает производительность, поскольку буфер индекса сбрасывается на диск только один раз, после завершения всех инструкций INSERT. Как правило, существует столько флагов индексного буфера, сколько есть инструкций INSERT. Явные операторы блокировки не нужны, если вы можете вставить все строки с одним INSERT.

И с транзакционным движком:

Чтобы получить более быстрые вставки для транзакционных таблиц, вы должны использовать START TRANSACTION и COMMIT вместо LOCK TABLES.

Поэтому я предполагаю, что использование транзакций может быть хорошей идеей – но я полагаю, что это может зависеть от нагрузки на вашем сервере и существует ли многократное использование одной и той же таблицы в тот же момент, и все это …

На странице, с которой я связан, есть больше информации, поэтому не стесняйтесь ее читать 😉

И если вы выполняете инструкции по обновлению :

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

Итак, я предполагаю, что можно сказать то же самое, что и для вставок.

Кстати: вы можете попробовать оба решения, сравнивая их с microtime , на стороне PHP, например 😉

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

http://www.desilva.biz/mysql/insert.html

Транзакция замедлит вас, поэтому, если вам это не понадобится, не используйте ее.

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

Я столкнулся с тем же вопросом, когда мне пришлось реализовать CSV-файл (возможно, довольно длинный) импорт данных (я знаю, что вы можете использовать синтаксис LOAD DATA INFILE для этого, но мне пришлось применить некоторую обработку на моих полях перед вставкой).

Поэтому я провел эксперимент с транзакциями и файл размером около 15 тыс. Строк. В результате, если я вставляю все записи в одну уникальную транзакцию, она занимает всего несколько секунд, и она привязана к процессору. Если я вообще не использую транзакции, это занимает несколько минут, и это ограничение ограничено. Зафиксировав каждую N строк, я получил промежуточные результаты.