2009-09-12 3 views
5

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

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

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

ответ

4

Если ваши запросы Вставка, страница 7.2.19. Speed of INSERT Statements руководства MySQL дает две интересной информации, в зависимости от того, являются ли вашим используя transactionnal двигатель или нет:

При использовании без transactionnal двигателя:

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

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

И с transactionnal двигателя:

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

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

Есть подробную информацию на странице я связан с, так что не стесняйтесь читать его ;-)


И, если вы делаете update statements:

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

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


КСТАТИ: чтобы быть уверенным, вы можете попробовать оба решения, бенчмаркинг их microtime, на стороне PHP, например ;-)

+0

Большое спасибо за информацию, я думаю, мне просто нужно попробовать и сравнить. – jeroen

+2

Я полагаю, что так ^^ Сообщите нам о результатах ;-) Это может заинтересовать других людей! И, кстати, другое решение заключалось бы в том, чтобы использовать один запрос на вставку для одновременного создания нескольких вставок, уменьшая общее количество запросов - немного сложнее кодировать, но я видел большие улучшения с этим, поскольку это означает меньше вызовы с одного сервера на другой. –

+0

Да, сокращение числа запросов было бы лучшим решением, но, как я уже упоминал Джеймсу Блэку, я никогда не пробовал это с INSERT ON DUPLICATE KEY UPDATE, даже не знаю, возможно ли это. – jeroen

3

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

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

Сделка будет замедлять вас вниз, так что если вам не нужно это, то не использовать его.

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

+0

Я думал о их объединении, но я никогда не пробовал это с INSERT ON DUPLICATE KEY UPDATE. – jeroen

3

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

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

+0

было бы еще быстрее с LOAD DATA INFILE;) – NickT

Смежные вопросы