본문 바로가기

IT 기본지식

대용량 DB 처리 관련 개념

 

 

<< DB 설계 및 구조 최적화 >>

 

1. 정규화 vs 비정규화

1) 정규화 : 중복데이터를 최소화하여 데이터 일관성을 유지

2) 비정규화 : 조회 속도를 높이기 위해 중복을 허용하고 조인을 줄임

 

 

2. 인덱스 최적화

 

- 인덱스는 select 성능을 향상시키지만, INSERT, UPDATE, DELETE 성능에는 영향을 줄 수 있다.

- B-Tree 인덱스(일반적인 인덱스), Hash 인덱스(빠른 조회), Full-Text 인덱스(검색 최적화)

- 대량 데이터에서 너무 많은 인덱스를 설정하면 INSERT 성능이 저하되므로 필요한 컬럼만 인덱싱

 

3. 파티셔닝

 

- 데이터를 여러 물리적 파일로 나누어 성능을 최적화

- 종류 : 범위 파티션, 리스트 파티션, 해시 파티션, 조합 파티션

- 테이블이 수십억 건 이상이면 파티셔닝을 고려하여 쿼리 성능을 최적화

 


<< SQL 튜닝 및 성능 최적화 >>

 

 

1. 쿼리 최적화

 

- EXPLAIN 또는 EXPLAIN ANALYZE로 실행 계획을 확인

- 불필요한 SELECT * 대신 필요한 컬럼만 조회

- 조인 최적화 : Nested Loop -> Hash Join -> Merge Join 순으로 성능 고려

- 서브 쿼리보다 JOIN 또는 WITH (Common Table Expression, CTE) 활용

- 대량 데이터에서는 ORDER BY, GROUP BY, DISTICT이 성능을 저하시키므로 인덱스 + 파티셔닝을 활용

 

 

2. 배치 처리 및 페이징

 

- 대량 데이터 처리 시 한 번에 처리하지 않고 배치(Batch)로 나누어 실행

- 페이징 시 LIMIT OFFSET 보다 WHERE id> last_seen_id LIMIT n 방식 사용

- 1000만 건 이상 데이터를 업데이트할 경우, 작업 단위를 나누어 실행하는 것이 중요

 

 


<< 대용량 데이터 처리 경험 사례 >>

 

1. 1억 건 이상 데이터에서 속도 최적화

- EXPLAIN으로 실행 계획 분석 후 필요한 인덱스 추가

- WHERE 조건을 INDEX RANGE SCAN이 가능하도록 수정

- JOIN 연산 최적화 (Nested Loop => Hash Join 변경)

- 쿼리 실행 시간 10초 => 0.5초로 개선

 

2. 대량 데이터 일괄 업데이트 최적화

- UPDATE를 직접 실행하면 DB 부하 급증 -> 배치(Batch)처리 적용

- 1000건 단위로 COMMIT하여 트랜잭션 부담 줄임

- 단일 트랜잭션 5분=>30초로 단축