엄지월드

[5차시] 데이터베이스 및 SQL 튜닝 : 데이터 처리 성능 극대화 본문

기타

[5차시] 데이터베이스 및 SQL 튜닝 : 데이터 처리 성능 극대화

킨글 2025. 3. 18. 23:07

데이터베이스 성능 최적화 개요 및 전략

  • 쿼리 최적화 전략
    • 서브쿼리 대신 조인 사용 
  • 인덱스 설정 최적화
    • 복합 인덱스를 사용하여 다중 조건 쿼리 성능 개선
    • 인덱스 스캔과 인덱스 시크의 차이 이해
      • 인덱스 스캔 : 전체 데이터를 훓음
      • 인덱스 시크 : 필요한 데이터만 빠르게 찾아가는 방식 
    • B-Tree 인덱스와 Hash 인덱스의 사용
      • B-Tree 인덱스 : 범위 검색 
      • Hash 인덱스 : 필요한 데이터만 빠르게 찾아감
  • 메모리 및 캐시 최적화
    • 버퍼 풀(Buffer Pool) 최적화로 디스크 I/O 최소화
    • 쿼리캐시 : 자주 사용되는 쿼리 결과를 메모리에 저장
    • Shared Buffers와 Work Mem의 적절한 크기 설정
    • 캐시 무효화 정책을 통한 데이터 최신 상태 유지
  • 디스크 I/O 최적화
    • 파티셔닝을 통해 데이터 분할 처리
    • I/O 대기 시간 분석 및 개선
  • 하드웨어 최적화 전략
    • CPU 코어 수 증가로 병렬 처리 능력 향상
    • 고속 네트워크 설정으로 데이터 전송 속도 개선
    • 디스크 성능 : SSD 사용과 RAID 구성으로 처리량 증가
  • 데이터베이스 설정 튜닝
    • MySQL : InnoDB 버퍼 풀과 쿼리 캐시 조정
    • PostgreSQL : Shared Buffers, Work Mem 설정 최적화
    • Oracle : SGA와 PGA 메모리 설정, AWR 보고서를 통한 성능 분

SQL 성능 최적화

  • WHERE절 최적화
    • 인덱스를 사용하는 조건으로 필터링
    • LIKE나 OR 대신 IN 절 사용
    • WHERE 절 조건의 순서를 최적화하여 성능 개선
  • JOIN 최적화
    • INNER JOIN과 OUTER JOIN의 성능 차이
    • 인덱스가 적용된 컬럼으로 JOIN
    • JOIN 순서 최적화로 성능 개선
    • 불필요한 조인은 성능 저하의 원인
  • 서브쿼리 대신 JOIN 사용
    • 서브쿼리는 성능 저하의 주 원인
    • JOIN을 사용하여 쿼리 재작성
    • 서브쿼리가 필수일 때는 인덱스 활용
  • SELECT 최적화
    • DISTINCT는 불필요하게 사용하지 말 것
  • LIMIT와 OFFSET 최적화
    • LIMIT와 OFFSET을 사용한 페이징 처리
    • 서브쿼리를 통해 성능 개선
    • 대량 데이터의 페이징에서 성능 문제 발생 가능성
    • 인덱스 기반 페이징을 사용하여 OFFSET 문제 해결
    • 데이터베이스에 적합한 페이징 전략 설계
    • 서브쿼리 최적화를 통해 OFFSET 문제 완화 
      • OFFSET이 클수록 성능이 떨어짐
  • 파티셔닝을 통한 성능 최적화
    • 파티셔닝을 사용하여 대용량 데이터를 효율적으로 관리
    • Range 파티셔닝과 Hash 파티셔닝 활용
    • 쿼리가 특정 파티션만 조회하도록 최적화
  • SQL 힌트(Hints) 사용
    • 힌트를 통해 쿼리 실행 계획 제어
    • 특정 인덱스 사용 강제
    • 병렬 처리를 통한 성능 개선

인덱스(INDEX) 최적화

  • 인덱스의 기본 개념
    • 인덱스는 테이블의 특정 컬럼에 대한 색인 역할
    • 인덱스를 사용하면 데이터 조회 속도를 크게 향상
    • B-Tree 인덱스가 가장 일반적으로 사용됨
  • 인덱스 스캔과 테이블 스캔
    • 인덱스 스캔 : 인덱스를 사용해 데이터를 조회
    • 테이블 스캔 : 전체 테이블을 스캔하여 데이터 조회
    • 인덱스를 사용하지 못하는 쿼리는 테이블 스캔을 유발할 수 있음
  • Clustered 인덱스와 Non-Clustered 인덱스
    • Clustered 인덱스 : 테이블의 물리적 데이터가 인덱스 순서에 따라 정렬
    • Non-Clustered 인덱스 : 인덱스와 데이터가 분리되어 관리
    • 한 테이블에 하나의 Clustered 인덱스만 생성 가능
    • Non-Clustered 인덱스는 다중 생성 가능, 조회 성능 향상에 사용

스프링 부트 데이터베이스 커넥션풀(HikariCP) 최적화

  • HikariCP 고급 설정
    • Leak Detection Threshold : 커넥션 누수 감지 시간 설정
    • Max Life time : 커넥션의 최대 수명 설정(기본값 : 30 분)
    • Validation Timeout : 커넥션 유효성을 검사하는 시간 설정
    • Auto Commit : 자동 커밋 여부 설정 (기본값 : true) 
Comments