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
반응형