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 알고리즘의 시간 소모적인 문제점을 해결
- 방법
- 전체 N개의 테이블 중에서 optimizer_search_depth 시스템 설정 변수에 정의된 개수의 테이블로 가능한 조인 조합 생성
- 1번에서 생성된 조인 조합 중에서 최소 비용의 실행 계획 하나를 선정
- 2번에서 선정된 실행 계획의 첫 번째 테이블을 부분 실행 계획의 첫 번째 테이블로 선정
- 전체 N-1개의 테이블 중에서 optimizer_search_depth 시스템 설정 변수에 정의된 개수의 테이블로 가능한 조인 조합을 생성
- 4번에서 생성된 조인 조합들을 하나씩 3번에서 생성된 부분 실행 계획에 대입해 실행 비용을 계산
- 5번의 비용 계산 결과, 최적의 실행 계획에서 두 번째 테이블을 3번에서 생성된 부분 실행 계획의 두 번째 테이블로 선정
- 남은 테이블이 모두 없어질 때까지 4~6번까지의 과정을 반복 실행하면서 부분실행계획에 테이블의 조인 순서를 기록
- 최종적으로 부분 실행 계획이 테이블의 조인 순서로 결정됨
- 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로 설정하기