<< 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초로 단축
'IT 기본지식' 카테고리의 다른 글
프로프레임이란 (6) | 2025.01.31 |
---|---|
자바의 특징 (객체 지향, 캡슐화, 상속, 다형성, 플랫폼 독립성) (3) | 2025.01.31 |
restAPI란 (3) | 2025.01.31 |
#8) OSI 7계층, TCP/IP 4계층 (5) | 2025.01.08 |
#7) HTTP 메서드 / GET과 POST의 차이점 (15) | 2025.01.07 |