Лучшие практики для массового удаления строк в MySQL с использованием JPA - PullRequest
0 голосов
/ 16 мая 2018

Название в значительной степени суммирует то, что я ищу здесь.

Я пытаюсь удалить> 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.

...