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

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

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

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

Ответы [ 3 ]

4 голосов
/ 12 сентября 2009

Если ваши запросы - ВСТАВКИ, страница 7.2.19. Скорость операторов INSERT в руководстве MySQL дает две интересные сведения, в зависимости от того, используете ли вы механизм транзакций:

При использовании нетранзакционного механизма:

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

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

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

Чтобы получить более быстрые вставки для транзакционные таблицы, вы должны использовать НАЧАТЬ СДЕЛКУ и совершить вместо ЗАМКОВЫХ СТОЛОВ.

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

На странице, на которую я ссылаюсь, есть больше информации, поэтому не стесняйтесь ее читать; -)


И, если вы делаете операторы обновления :

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

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


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

3 голосов
/ 26 марта 2013

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

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

3 голосов
/ 12 сентября 2009

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

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

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

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

...