Является ли буферизация коммитов в MySQL / PyMySQL жизнеспособной альтернативой вставке нескольких строк одновременно? - PullRequest
0 голосов
/ 30 июня 2018

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

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

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

1 Ответ

0 голосов
/ 01 июля 2018

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

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

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

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

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

...