데이터베이스/RDBMS
[MYSQL] 기본 실행 계획 분석 - 1
itboxer91
2025. 1. 2. 23:49
MYSQL SQL문의 기본실행계획분석
: EXPLAIN 명령어를 통해 SQL의 실행계획을 분석할 수 있다. 이를 통해 SQL문이 효율적으로 혹은 비효율적으로 수행되지 않는지, 비효율적으로 수행된다면 어떻게 튜닝을 해야 하는지 감을 잡을 수 있다.
EXPLAIN
SELECT 사원.사원번호, 급여.연봉
FROM 사원,
(SELECT 사원번호, MAX(연봉) AS 연봉
FROM 급여
WHERE 사원번호 BETWEEN 10001 AND 20000 GROUP BY 사원번호) AS 급여
WHERE 사원.사원번호 = 급여.사원번호;
1. 인덱스 스캔 VS 테이블 풀 스캔을 비교해야 한다. → 사례 중심으로 정리
2. 난이도 높은 개념 : Extra - Using Temprory , Type - ref, index 개념 확실히 하기.
실행 계획에 대한 정의 및 간단한 예시로 분석을 진행한다.
헷갈리는 개념만 작성한다. 자세한 것은 업무용 블로그에 ..
1. ID 컬럼
- 쿼리의 실행 순서를 표시하는 숫자이다.
- 순서가 동일할 시에는 JOIN 이 발생한 것이다. (* 순서 동일시에 상단 로우가 드라이빙 TB, 하단 로우가 드리븐 TB)
2. SELECT_TYPE 컬럼 : SQL문을 구성하는 SELECT 문의 유형을 출력하는 항목이다.
- PRIMARY
- 서브쿼리가 포함된 SQL문이 있을 때 첫 번째 SELECT 문에 해당하는 구문에 표시되는 유형.
- UNION이 포함된 SQL문에서 첫 번째로 SELECT 키워드가 작성된 구문에 표시된다.
- DERIVED
- FROM 절에 명시 된 서브쿼리 (* 즉 인라인 뷰) 라는 의미이다.
- UNION RESULT
- UNION 구분으로 SELECT 절을 결합 했을 때 생성.
- UNION ALL 과 달리 중복제거를 진행해야 함. 튜닝 必 (* 메모리 또는 디스크에 임시TB을 진행 한다.)
- DEPENDENT SUBQUERY | DEPENDENT UNION
- UNION 또는 UNION ALL 을 사용하는 서브쿼리가 메인쿼리의 영향을 받는 경우.
- 서브쿼리가 독립적으로 미수행되고, 메인 테이블로 값을 공급받는 경우. 튜닝 必 → JOIN 으로 실행하는 것이 낫다.
- UNION으로 연결 된 단위 쿼리들의 실행순서가 첫번째 인지 두번째 인지 경우에 따라 값이 달라진다.
3. TYPE 컬럼 : TB의 데이터를 어떻게 찾을 지에 관한 정보를 제공하는 항목.
TYPE 컬럼은 매우 중요한 컬럼이다.
풀스캔 혹은 인덱스를 태울지 판단의 근거가 된다.
- EQ_REF
- JOIN 수행 시 기본 키나 고유 인덱스를 활용하여, 드리븐 TB에 1건의 데이터씩만 조회하는 유형.
- 튜닝 시에 성능상 매우 유리
EXPLAIN
SELECT 매핑.사원번호, 부서.부서번호, 부서.부서명
FROM 부서사원_매핑 AS 매핑,
부서
WHERE 매핑.부서번호 = 부서.부서번호
AND 매핑.사원번호 BETWEEN 100001 AND 100010;
- REF
- JOIN 수행 시 기본 키나 고유 인덱스를 활용하여, 드리븐 TB에 2건의 이상의 데이터를 조회하는 유형.
( 드라이빙TB : 드리븐TB 가 1 : N인 경우)
EXPLAIN
SELECT 사원.사원번호, 직급.직급명
FROM 사원,
직급
WHERE 사원.사원번호 = 직급.사원번호
AND 사원.사원번호 BETWEEN 10001 AND 100010;
- 드리븐TB인 직급TB에 TYPE은 REF다. 따라서 2개 이상의 데이터가 조인 걸려 있을 확률이 높다.
eq_ref 와 ref 가 꼭 JOIN 할 시에만 사용하는 개념은 아니다. 1개 테이블 접근시에도 사용되는 개념이다.
로데이터 추출시에도 ref는 확인할 필요가 있다. 데이터를 여러개 나오게 하는 원인이 될 수 있다.
4. filtered : MYSQL 엔진으로 가져온 데이터들이 어느 정도 비율로 제거 했는지를 의미한다.
- SQL문을 통해 DB 엔진으로 가져온 데이터 대상으로 필터 조건에 따라 어느 정도 비율로 데이터를 제거 했는지를 의미하는 항목이다. → 스토리지 엔진에서 가져 온 데이터가 필터 조건 후, 얼마나 남았는지를 의미한다.
filtered의 의미가 헷갈릴 수 있다. 필터링 이후 제거되었다는 것인지, 남았다는 것인지(?) 말이다.
직관적으로는 '남았다는 것' 으로 이해하자. 단, (1-filtered) 비율은 '제거되었다는 것'으로 반대로 생각해
볼 수도 있다. 그렇기 때문에 단위가 %(퍼센티이지) 이다.