Фон
Я работаю над инструментом синхронизации данных , который прослушивает изменения из БД, обрабатывает эти изменения и отправляет их в другую целевую БД.
Когда я былВыполняя тестирование производительности на MySQL, я столкнулся с некоторыми проблемами.
Проблемы
Теперь я использую Spring JdbcTemplate#batchUpdate
для отправки пакета изменений данных в MySQL.
String[] sqlStatement = new String[]{"insert ...;", "update ...;", "delete ...;"};
jdbcTemplate.batchUpdate(sqlStatement)
Этот вид пакета содержит различные виды операций (insert
, update
, delete
) для разных таблиц.Поэтому опция rewriteBatchedStatements=true
не очень полезна (хотя я добавил эту опцию, но не вижу никакого повышения).
Теперь средняя скорость вставки составляет около 1300 / с (хотя Elasticsearch может достигать 10000 и более.Ниже приведен некоторый результат теста).
time: 20190407-022652
src=800000
dst=9302
time: 20190407-022654
src=800000
dst=12070
time: 20190407-022656
src=800000
dst=14863
time: 20190407-022658
src=800000
dst=17536
То есть какие-либо предложения по оптимизации этого вида партии?
Возможное решение
autocommit=0;
& commit;
?: может помочь целая партия в одной транзакции, но может быть побочный эффект, поэтому мы очень осторожны с этой опцией.