IT/Spring

Spring - MySQL 대량의 데이터 삭제하는 법(batch)

eddie_factory 2025. 2. 9. 11:40
반응형

Spring 프로젝트를 하던 중 테이블의 1000만건 이상의 데이터를 삭제해야 하는 상황이 있었다.

 

처음에는 1000만 건의 데이터를 DELETE query 한번으로 했으나,

이렇게 되면 인덱스가 잡혀있더라도 삭제 - 재인덱싱하는데 100초이상의 시간이 걸렸다. (컬럼 길이에 따라 다르겠지만..)

 

그래서 삭제 주기를 늘리는 대신 일정 단위만큼 나눠서 삭제하는 방법을 선택했다.

 

1.  MySQL 프로시저를 통해 삭제하는 방법

SET @batch_size = 1000; -- 배치 크기 설정
REPEAT
    DELETE FROM your_table
    WHERE your_index_column IN (
        SELECT your_index_column
        FROM your_table
        WHERE your_index_column IN (index_column 모음값)
        LIMIT @batch_size
    );
UNTIL ROW_COUNT() = 0 END REPEAT;

 

2. 서비스에서 배치사이즈를 지정해서 삭제하는 방법

@Service
public class YourService {

    @Autowired
    private YourDao yourDao;

    public void deleteLargeData(List<Long> bigIndexes) {
		  int batchSize = 1000;

	    for (int i = 0; i < ids.size(); i += batchSize) {
				List<Long> subIndexes = bigIndexes.subList(i, Math.min(i + batchSize, bigIndexes.size()));
				yourDao.deleteByIndex(subIndexes);
        }
    }
}


개인적 상황으로는...

sql 조건절 IN에 너무 많은 수의 값이 들어가면 인덱스 적용이 안되는 것 같아 아래의 방법을 사용했다.

삭제 대상 컬럼이 순차적으로 증가하는 컬럼이여서 최소 index와 최대 index값을 사용하기로 했다.

DELETE FROM your_table
WHERE your_index_column >= minIndex
AND   your_index_column <= maxIndex
반응형