Производительность в PDO / PHP / MySQL: транзакция или прямое выполнение
Я перебираю несколько значений (например, от 1 до 100) и выполняю подготовленный оператор внутри цикла.
Есть ли и преимущество использования транзакции - фиксации после окончания цикла - по сравнению с прямым выполнением внутри цикла?
Значения не зависят друг от друга, поэтому транзакция не требуется с этой точки зрения.
3 ответа
Если ваши запросы являются INSERT, то страница 7.2.19. Скорость INSERT. Утверждения руководства MySQL дают две интересные сведения, в зависимости от того, используете ли вы механизм транзакций или нет:
При использовании нетранзакционного движка:
Чтобы ускорить операции INSERT, которые выполняются с несколькими операторами для нетранзакционных таблиц, заблокируйте их.
Это повышает производительность, поскольку буфер индекса сбрасывается на диск только один раз после завершения всех операторов INSERT. Обычно, было бы столько же сбросов индексного буфера, сколько и операторов INSERT. Явные операторы блокировки не нужны, если вы можете вставить все строки одним INSERT.
И с транзакционным движком:
Чтобы получить более быстрые вставки для транзакционных таблиц, вы должны использовать START TRANSACTION и COMMIT вместо LOCK TABLES.
Поэтому я предполагаю, что использование транзакций может быть хорошей идеей - но я полагаю, что это может зависеть от нагрузки на ваш сервер, а также от того, есть ли несколько пользователей, использующих одну и ту же таблицу в одно и то же время, и все такое...
На странице, на которую я ссылаюсь, есть больше информации, так что не стесняйтесь ее читать;-)
И, если вы делаете операторы обновления:
Еще один способ получить быстрые обновления - отложить обновления, а затем сделать много обновлений подряд. Выполнять несколько обновлений вместе гораздо быстрее, чем по одному, если вы заблокируете стол.
Так что, думаю, можно сказать то же самое, что и для вставок.
Кстати: конечно, вы можете попробовать оба решения, сравнивая их сmicrotime
на стороне PHP, например;-)
Я столкнулся с тем же вопросом, когда мне пришлось реализовать импорт данных в CSV-файл (возможно, довольно длинный) (я знаю, что для этого можно использовать синтаксис LOAD DATA INFILE, но мне пришлось применить некоторую обработку к моим полям перед вставкой).
Поэтому я провел эксперимент с транзакциями и файлом с 15k строками. В результате, если я вставлю все записи в одну уникальную транзакцию, это займет всего несколько секунд, и это будет связано с процессором. Если я вообще не использую транзакцию, это займет несколько минут и будет ограничено. Зафиксировав каждые N строк, я получил промежуточные результаты.
Для более быстрого времени вы можете сделать все вставки за один снимок или сгруппировать их вместе, возможно, по 5 или 10 за один раз, как если бы одна вставка не удалась, вся партия будет.
http://www.desilva.biz/mysql/insert.html
Транзакция замедлит вас, поэтому, если она вам не нужна, не используйте ее.
Готовый оператор будет хорошим выбором, даже если вы выполняли пакетную вставку, поскольку вам не нужно каждый раз создавать запрос.