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

Saif, превосходная ссылка. Обзор птичьего глаза, которому удается затронуть большинство тем и предоставить подробную информацию об определенных реализациях поставщика.

я сделал три попытки при записи объяснения, но это - действительно слишком большая тема. Проверьте статью Hellerstein (та на сервере Беркли что Saif, связанный с), и затем спросите о специфических особенностях.

стоит отметить, что только подмножество "известных хороших идей" реализовано в любом данном DBMS. Например, SQLite даже не делает хэширований, он только делает вложенные циклы (ack!!). Но тогда, это - легко встраиваемая DBMS, и это делает свою работу очень хорошо, таким образом, существует что-то, чтобы быть сказанным из-за отсутствия сложности.

Приобретение знаний о том, как DBMS собирает статистику и как это использует их для построения планов запросов, а также изучения, как прочитать планы запросов во-первых, является неоценимым навыком - если необходимо выбрать одну "тему" внутренностей базы данных для изучения, изучить это. Это сделает мир различия (и Вы никогда не будете случайно писать Декартово произведение снова...;-)).

5
задан OMG Ponies 12 September 2009 в 17:10
поделиться

2 ответа

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

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

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

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

И с помощью механизма транзакций:

Чтобы получить более быструю вставку для транзакционные таблицы, вы должны использовать НАЧАТЬ ТРАНЗАКЦИЮ и ЗАКУПИТЬ вместо этого ТАБЛИЦ БЛОКИРОВКИ.

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

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


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

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

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


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

4
ответ дан 13 December 2019 в 22:12
поделиться

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

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

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

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

3
ответ дан 13 December 2019 в 22:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: