티스토리 뷰
쿼리를 작성하면서 이 쿼리는 테이블 풀 스캔이 일어나는 쿼리다, 일어나지 않는 쿼리다, 인덱스는 어떻게 사용하는 게 더 좋을 것 같다 등의 말을 들었는데, 도대체 그걸(테이블 풀 스캔이 일어나는지, 아닌지) 어떻게 아는지 궁금했다. 그러다가 EXPLAIN을 알게 되어 정리해본다. 아래의 링크들을 참고하여 작성했다.
8.8.1 Optimizing Queries with EXPLAIN
Real MySQL [6-5] 실행계획 - EXPLAIN EXTENDED, PARTITIONS
EXPLAIN은 MySQL이 어떻게 구문을 실행하는지에 대한 정보를 제공한다. SELECT, DELETE, INSERT, REPLACE, UPDATE와 함께 사용할 수 있다.
간단한 예로, 행이 2개뿐인 users테이블을 조회하는 다음 쿼리에 EXPLAIN을 사용했고, 다음과 같은 결과를 얻었다.
explain select * from users;
id : SELECT 식별자(구문에 서브쿼리나 UNION 등 SELECT가 다수 존재할 수 있을 경우, 순서에 따라 순차적으로 번호 부여)
select_type : SIMPLE은 서브쿼리나 UNION이 없는 단순 SELECT문일 경우를 나타낸다.
table : 결과물을 뽑아낸 테이블을 나타낸다.
partitions : 테이블의 파티션 중 어떤 파티션을 사용했는지 등의 정보를 나타낸다.
type : ALL은 테이블을 처음부터 끝까지 검색하는 경우로, 일반적으로 테이블 풀 스캔이라고 한다.
possible_keys : 선택 가능한 인덱스 리스트를 나타낸다.
key : 실제로 선택한 인덱스를 나타낸다.
key_len : MySQL이 인덱스에 얼마나 많은 바이트를 사용하고 있는지 보여준다.
ref : index와 비교되는 컬럼으로, key에 나와있는 인덱스에서 값을 찾기 위해 선행 테이블의 어떤 컬럼이 사용되었는지를 나타낸다.
rows : 원하는 행을 찾기 위해 얼마나 많은 행을 읽어야 할지에 대한 예측값을 나타낸다.
filtered : MySQL 엔진에 의해 필터링되어 제거된 레코드를 제외하고 최종적으로 남은 row의 비율(%)을 나타낸다. rows가 2건이고 filtered가 100%이므로 엔진이 전체 2건의 row를 읽어서 100%만 남았다는 의미이다. 이 값은 실제값이 아닌 통계정보로부터 예측된 값이다.
Extra : 추가정보를 나타낸다.
* 의미에 대한 더 자세한 설명은 위 세번째 링크를 참고하면 된다.
'공부흔적 > 데이터베이스' 카테고리의 다른 글
MySQL에 대량 데이터 빨리 넣기 (0) | 2023.02.22 |
---|---|
오라클 SQL 성능 튜닝 (0) | 2022.05.10 |
index (0) | 2021.04.19 |