Является ли фиксация коммитов в MySQL / PyMySQL жизнеспособной альтернативой вставке нескольких строк одновременно?

0

Я разрабатываю приложение для сбора данных, которое включает постоянную вставку в базу данных MySQL. Я использую Python и PyMySQL для этого. Мне нужно вставить около 100 строк в основную таблицу в секунду. Процесс python постоянно работает и поддерживает постоянное соединение с базой данных MySQL, которая находится на удаленном сервере.

Я знаю, что в целом лучше вставлять данные в виде буферов (несколько строк одновременно), а не делать отдельные вставки. Выполнение коммитов (connection.commit() в PyMySQL) каждые 100 или около того вставок достигают некоторых из тех же накладных сокращений, что и вставка больших объемов данных сразу?

По синтаксическим причинам легче разделить вставки строк на отдельные операции.

  • 0
    Вы говорите об этом в контексте транзакции? В противном случае большинство драйверов устанавливают автоматическую фиксацию, поэтому каждый оператор автоматически фиксируется, а явные вызовы фиксации являются избыточными. Вы можете использовать «multi- INSERT » для этого или считывать данные из файла, используя LOAD DATA INFILE если скорость имеет первостепенное значение.
Теги:
pymysql

1 ответ

0

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

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

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

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

Конечно, если есть какая-то причина, почему индивидуальные запросы вставки более желательны, то использование нескольких потоков в вашей программе и несколько соединений с базой данных является возможной стратегией для повышения производительности, поскольку n соединений могут параллельно выполнять n запросов, тем самым уменьшая чистое практическое влияние времени кругового движения t на что-то вблизи t/n.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню