피드로 돌아가기
Optimizing Large-Scale Data Ingestion into Relational Database
Dev.toDev.to
Database

MySQL 대용량 데이터 적재 성능을 180초에서 3초로 개선한 최적화 과정

Optimizing Large-Scale Data Ingestion into Relational Database

ElementalSilk2026년 3월 31일6intermediate

Context

SFTP 서버에서 18MB~100MB용량의 CSV 파일(8만~120만 행)을 MySQL에 주기적으로 적재해야 했다. 초기 Java 기반의 분산 트랜잭션과 로컬 캐싱을 사용했으나, AWS M3-Medium 서버(8GB RAM)에서 처리 시간이 80~200초 소요되었으며 클라이언트 5대에서 30대로 확장 시 테이블 락과 스케일링 문제로 실패했다.

Technical Solution

  • [대상 테이블] → [동일 구조의 TEMP 테이블 생성]하여 스테이징 방식으로 전환
  • [CSV 파싱] → [LOAD DATA LOCAL INFILE 명령] 사용하여 MySQL 엔진 레벨에서 직접 벌크 적재
  • [긴 트랜잭션 유지] → [Propagation.REQUIRES_NEW를 활용한 async 트랜잭션 Executor]로 각 단계별 격리
  • [단건 비교 처리] → [JOIN 기반의 UPDATE + INSERT 쿼리]로 집합 연산으로 전환
  • [임시 파일] → [처리 완료 후 삭제]하여 가비지 컬렉션 유도

Impact

클라이언트 5대에서 30대로 확장 시 처리 시간 180초에서 3초로 단축되었으며 데이터베이스 병목 현상이 해소되었다.

Key Takeaway

스테이징 테이블과 SQL 집합 연산은 루프 기반의 애플리케이션 코드보다 데이터베이스 엔진 최적화의 장점을하며 대규모 데이터 처리에서 필수적이다.


대용량 CSV/TXT 파일을 MySQL에 적재하는 환경에서 TEMP 테이블 + LOAD DATA LOCAL INFILE + async 트랜잭션 패턴을 조합하면 순수 Java 처리 대비 60배 이상의 성능 향상을 달성할 수 있다.

원문 읽기