2025-10-20

오늘 배운 것

9.3 고급 최적화

9.3.2 조인 최적화 알고리즘

  • MySQL에는 조인 쿼리의 실행 계획 최적화를 위한 알고리즘 2개 존재
    • 왜?
      • 테이블의 개수가 많아지면 최적화된 실행계획을 찾는 것이 상당히 어려워짐
      • 하나의 쿼리에서 조인되는 테이블의 개수가 많아지면 실행계획 수립이 오래걸림
      • 테이블 개수가 특정 한계를 넘어서면 실행 계획 수립에만 몇시간에서 며칠로 늘어날 수 있음
      • 이를 해결하기 위한 알고리즘

9.3.2.1 Exhaustive 검색 알고리즘

  • FROM절에 명시된 모든 테이블의 조합에 대해 실행 계획의 비용을 계산해서 최적의 조합 1개를 찾는 방법
  • 테이블이 20개라면 경우의 수 20! → 오래걸림

9.3.2.2 Greedy 검색 알고리즘

  • Exhaustive 알고리즘의 시간 소모적인 문제점을 해결
  • 방법
    1. 전체 N개의 테이블 중에서 optimizer_search_depth 시스템 설정 변수에 정의된 개수의 테이블로 가능한 조인 조합 생성
    2. 1번에서 생성된 조인 조합 중에서 최소 비용의 실행 계획 하나를 선정
    3. 2번에서 선정된 실행 계획의 첫 번째 테이블을 부분 실행 계획의 첫 번째 테이블로 선정
    4. 전체 N-1개의 테이블 중에서 optimizer_search_depth 시스템 설정 변수에 정의된 개수의 테이블로 가능한 조인 조합을 생성
    5. 4번에서 생성된 조인 조합들을 하나씩 3번에서 생성된 부분 실행 계획에 대입해 실행 비용을 계산
    6. 5번의 비용 계산 결과, 최적의 실행 계획에서 두 번째 테이블을 3번에서 생성된 부분 실행 계획의 두 번째 테이블로 선정
    7. 남은 테이블이 모두 없어질 때까지 4~6번까지의 과정을 반복 실행하면서 부분실행계획에 테이블의 조인 순서를 기록
    8. 최종적으로 부분 실행 계획이 테이블의 조인 순서로 결정됨
  • optimizer_search_depth 시스템 변수의 기본값 62
    • 1 ~ 62 : 해당 값으로 검색
    • 0 : 옵티마이저가 자동으로 개수 선정
    • 조인 테이블이 optimizer_search_depth보다
      • 클 때 : 시스템 변수 값까지의 테이블은 Greedy + 나머지는 Exhaustive 사용
      • 작을 때 : Exhaustive만 사용
    • optimizer_search_depth를 4 ~ 5정도로 설정하는 것이 좋음
  • optimizer_prune_level 시스템 변수
    • Heuristic 검색이 작동하는 방식을 제어
      • Heuristic 검색 : 다양한 조인 순서의 비용을 계산하는 도중 이미 계산했던 조인 순서의 비용보다 큰 경우에는 언제든지 중간에 포기
    • 1 : Heuristic 알고리즘 사용
    • 0 : 미사용
    • 사용하지 않으면 상당한 성능차이를 내기 때문에 되도록 1로 설정하기

results matching ""

    No results matching ""