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

StackOverflow https://stackoverflow.com/questions/1415602

Вопрос

Я перебираю несколько значений (например, от 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 для этого, но мне пришлось применить некоторую обработку к моим полям перед вставкой).

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top