책에서는 가독성이 좋은 테이블 포맷으로 실행계획을 살펴본다.
각각의 실행계획 테이블 컬럼들의 역할을 알아보자,
1. id
각각의 셀렉트를 분리해 구분할 수 있다. 이것을 단위 쿼리라한다.
예를 들어 셀렉트절에 서브쿼리가 존재한다면 셀렉트절이 두개이므로 실행 계획에는 셀렉트절의 아이디가 1 , 2 두개가 존재할것이다.
2.select_type
각각의 select 쿼리가 어떤 타입의 쿼리인지 알려주는 컬럼
- simple
- UNION이나 서브쿼리를 사용하지 않는 단순한 셀렉트 쿼리 아무리 복잡한 쿼리라도 실행 계획에서 simple 단위 쿼리는 단 한개만 존재한다.
- 일반적으로 가장 바깥 쿼리가 simple로 표시된다.
- PRIMARY
- UINON이나 서브쿼리를 가지는 셀렉트 쿼리에서 가장 바깥쪽에 있는 단위쿼리
- UNION
- UNION으로 결합하는 단위 셀렉트 쿼리 가운데 첫번째를 제외한 두번째 이후 단위 셀렉트 쿼리
- 첫번째 쿼리는 DERIVED 로 나타난다.
- UNION RESULT
- UNION 결과를 담아두는 테이블을 의미한다.
- SUBQUERY
- FROM절 이외에서 사용되는 서브쿼리를 의미
3. table
테이블 명을 의미한다.
"< > " 안에 둘러 쌓인 이름이 명시되는 경우가 많은데 이는 임시 테이블을 뜻한다. 안에 표시되는 숫자의 단위는 위의 id값을 지칭함.
4.type
각 테이블의 레코드를 어떤 방식으로 읽었는지를 나타낸다.
여기서 방식이라함은 인덱스를 사용해 읽었는지 풀 테이블 스캔인지를 나타낸다.
ALL을 제외한 모든 타입이 모두 인덱스를 사용하는 접근방법이다.
ALL 은 풀 테이블 스캔을 의미
- const
- 프라이머리키나 유니크 키 칼럼을 이용하는 WHERE 조건절을 가지고있으며, 반드시 1건을 반환하는 쿼리의 처리방식일때
- 다른 DBMS에서는 UNIQUE_INDEX_SCAN 이라고 한
- eq_ref
- 조인되는 쿼리의 실행 계획에서만 표시된다.
- 처음 읽은 테이블의 칼럼값을, 테이블의 프라이머리 키나 유니크 키 칼럼의 검색 조건에 사용할 때를 가리킨다.
- 반드시 1건이 검색됨 -> 유니크 컬럼 검색 조건이기에
- ref
- 인덱스의 종류와 관계없이 동등 조건으로 검색할때는 ref가 사용된다.
- eq_ref 에비해 느리지만 꽤 빠른편
- range
- 인덱스 레인지 스캔의 접근방법
- IS NULL, BETWEEN, IN, LIKE 등의 연산자를 이용해 인덱스를 검색할 때 사용된다.
- index
- index full scan을 의미한다.
- LIMIT 조건이 없거나 레코드 건수가 많아지면 느린 처리를 수행한다.
5. possible_keys
옵티마이저가 최적의 실행 계획을 만들기위해 후보로 선정했던 접근 방법에서 사용되는 인덱스의 목록
특별한 경우가 아니라면 무시해도 된다. 여기에 적혀있는 인덱스를 반드시 사용하는것이 아니다.
6. key
최종 선택된 실행 계획에서 사용되는 인덱스
PRIMARY 를 제외하고 모두 INDEX의 이름이 사용된다.
7.key_len
쿼리를 처리하기위해 다중 컬럼으로 구성된 인덱스에서 몇 개의 컬럼까지 사용했는지 알려준다.
8.ref
접근 방법이 ref면 참조 조건으로 어떤 값이 제공됐는지 보여준다. 상수값을 지정했다면 ref는 const로 표시되고 다른 테이블의 컬럼 값이면 그 테이블의 컬럼명이 표시된다.
9.row
대상 테이블에 얼마나 많은 레코드가 포함되어있는지 또는 각 인덱스 분포도가 어떤지를 통계 정보를 기준으로 예측한다.
예측된 레코드 건수이기에 정확하지는 않다.
'책 > RealMySQL8.0' 카테고리의 다른 글
트랜잭션과 잠금 1 (3) | 2024.10.10 |
---|---|
실행 계획 1 (0) | 2024.08.04 |
MySQL Engine Architecture (0) | 2024.08.03 |