Название в значительной степени суммирует то, что я ищу здесь.
Я пытаюсь удалить> 500000 строк из MySQL, используя Spring JpaRepository#deleteInBatch(Iterable<T> batch)
, CrudRepository#delete(Iterable<T> batch)
или JPADeleteClause
, и либо исчерпывающе создаю> 500000 операторов удаления.
entities.forEach(e->deleteClause.where(event.id.eq(e.getId())));
или создание пакетов с помощью in
пунктов
Lists.partition(events, MAXIMUM_PACKET_SIZE).forEach(
packet->deleteClause.where(event.id.in(packet.stream()
.map(Event::getId)
.collect(
Collectors.toList())))
.execute()
);
Некоторые из этих методов не работают из-за порогов в самом MySQL
Объем памяти N байт для
«range_optimizer_max_mem_size» превышен. Спектр
оптимизация не была выполнена для этого запроса.
Слишком большой пакет для запроса (4895385> 1048576). Вы можете изменить это значение на сервере, установив переменную max_allowed_packet '.
в то время как те, кто в конечном итоге преуспевает, чрезвычайно трудоемки.
Существуют ли передовые практики в отношении подобных сценариев?
Я в основном ищу подход, который не повлияет ни на одну из существующих конфигураций MySQL. Это потому, что я ищу наименее распространенные решения, по крайней мере, в отношении конфигурации сервера MySQL.