Python mysql executemany () и коммит против многих execute () и коммит - PullRequest
0 голосов
/ 04 мая 2020

В настоящее время я пишу код для вставки набора данных объекта в базу данных mysql с помощью простого сценария python. Количество строк, которое мне нужно вставить, составляет порядка нескольких тысяч. Я хотел бы иметь возможность сделать это как можно быстрее, и хотел знать, есть ли разница в производительности между вызовом executeMany () для ряда строк и последующим вызовом commit (), многократным вызовом execute () и последующим вызовом совершить ()

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

В python это должно быть безразлично, потому что данные должны быть переданы перед вставкой.

, поэтому не должно быть небольшой разницы между execute и executemanybut, как указано здесь

домашняя страница mysql также состояния

С помощью метода executemany () невозможно указать несколько операторов для выполнения в аргументе операции. Это вызывает исключение InternalError. Попробуйте использовать execute () с multi = True.

Так что если у вас есть сомнения по поводу производительности, вы можете взглянуть на sqlalchemy , кажется, немного быстрее, но требуется время, чтобы заставить его работать

0 голосов
/ 04 мая 2020

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

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

В документации MySQL есть интересный раздел о , как оптимизировать insert операторы - вот несколько вариантов выбора:

  • синтаксис load data - самый быстрый из доступных вариантов

  • с использованием нескольких списков values() также намного быстрее, чем запуск нескольких inserts

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...