Трудно запустить несколько процессов пакетной загрузки одновременно.
Ускорьте запросы DELETE, используемые в вашем пакетном процессе. Запустите для них EXPLAIN
, чтобы убедиться, что у них есть нужные индексы, затем добавьте нужные индексы.
Попробуйте использовать SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
перед запуском пакета в каждом сеансе. Если каждый пакет обрабатывает свой собственный отдельный набор строк, это может (или не может) позволить немного больше параллелизма.
Попробуйте уменьшить размер (количество строк) пакетов. Причина повышения производительности при использовании пакетов транзакций состоит в том, чтобы избежать дорогостоящего выполнения COMMIT для каждой строки. Вы получаете наибольшее повышение производительности с пакетами из 100 строк, как и с пакетами из 10 000 строк.
Попробуйте загрузить каждый входящий пакет во временную таблицу вне транзакции. Затем используйте эту временную таблицу внутри транзакции для обновления. Что-то вроде этого кода, который явно проще, чем вам нужно.
CREATE TEMPORARY TABLE batchrows;
INSERT INTO batchrows (col,col,col) VALUES(a,b,c);
INSERT INTO batchrows (col,col,col) VALUES(d,e,f);
INSERT INTO batchrows (col,col,col) VALUES(g,h,i);
BEGIN TRANSACTION;
INSERT INTO maintable SELECT * FROM batchrows;
DELETE FROM maintable WHERE col IN (SELECT whatever FROM batchrows); /* ??? */
COMMIT;
DROP TEMPORARY TABLE batchrows;
Суть этого? Уменьшение истекшего времени, в течение которого удерживается блокировка транзакции.
Наконец: не пытайтесь выполнять пакетную загрузку параллельно. Иногда целостность ваших данных просто требует, чтобы вы обрабатывали партии одну за другой. Собственно, именно это и происходит сейчас в вашей системе: каждая партия должна ждать завершения предыдущей.