JSCODE Logo
프로그래밍 과외블로그후기멘토진
회사명 : JSCODE대표 : 박재성사업자 등록번호 : 244-22-01557통신판매업 : 제 2023-인천미추홀-0381 호
학원 명칭 : 제이에스코드(JSCODE)원격학원학원설립ㆍ운영 등록번호 : 제6063호

서울특별시 구로구 경인로 20가길 11(오류동, 아델리아)

Copyright ⓒ 2025 JSCODE - 최상위 현업 개발자들의 프로그래밍 교육 All rights reserved.

이용약관개인정보처리방침
← 블로그 목록으로 돌아가기

실행 계획에서 type 의미 분석하기 (ALL, index)

JSCODE 박재성
JSCODE 박재성
2025-12-02
author
JSCODE 박재성
category
MySQL
createdAt
Dec 2, 2025
series
비전공자도 이해할 수 있는 MySQL 성능 최적화 입문/실전 (SQL 튜닝편)
slug
explain-type-all-index
type
post
updatedAt
Dec 2, 2025 10:54 AM
❗
실행 계획(EXPLAIN)을 조회했을 때 나오는 결과값 중 하나인 type에 대해서 자세히 알아보자. 성능 최적화에 있어서 이 값의 의미를 파악하는 게 굉장히 중요하다.
notion image
 

✅ ALL : 풀 테이블 스캔

풀 테이블 스캔(Full Table Scan)이란 인덱스를 활용하지 않고 테이블을 처음부터 끝까지 전부 다 뒤져서 데이터를 찾는 방식이다. 처음부터 끝까지 전부 다 뒤져서 필요한 데이터를 찾는 방식이다보니 비효율적이다.
출처 : 업무에 바로 쓰는 SQL 튜닝 (책)
출처 : 업무에 바로 쓰는 SQL 튜닝 (책)
 
 
[예제]
  1. 테이블 생성
    1. DROP TABLE IF EXISTS users; # 기존 테이블 삭제 CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), age INT );
 
  1. 더미 데이터 생성
    1. INSERT INTO users (name, age) VALUES ('Alice', 30), ('Bob', 23), ('Charlie', 35);
 
  1. 실행 계획 조회하기
    1. EXPLAIN SELECT * FROM users WHERE age = 23; # type : ALL
      users 테이블의 데이터는 age를 기준으로 정렬되어 있지 않고 id를 기준으로 정렬되어 있다. 그래서 age = 23의 값을 가진 데이터를 찾으려면 테이블의 처음부터 끝까지 다 뒤져봐야 한다. 그래서 실행 계획의 type이 ALL로 나온 것이다.
 
 

✅ index : 풀 인덱스 스캔

풀 인덱스 스캔(Full Index Scan)이란 인덱스 테이블을 처음부터 끝까지 다 뒤져서 데이터를 찾는 방식이다. 인덱스의 테이블은 실제 테이블보다 크기가 작기 때문에, 풀 테이블 스캔(Full Table Scan)보다 효율적이다. 하지만 인덱스 테이블 전체를 읽어야 하기 때문에 아주 효율적이라고 볼 수는 없다.
출처 : 업무에 바로 쓰는 SQL 튜닝 (책)
출처 : 업무에 바로 쓰는 SQL 튜닝 (책)
 
[예제]
  1. 테이블 생성
    1. DROP TABLE IF EXISTS users; # 기존 테이블 삭제 CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), age INT );
 
  1. 더미 데이터 생성
    1. -- 높은 재귀(반복) 횟수를 허용하도록 설정 -- (아래에서 생성할 더미 데이터의 개수와 맞춰서 작성하면 된다.) SET SESSION cte_max_recursion_depth = 1000000; -- 더미 데이터 삽입 쿼리 INSERT INTO users (name, age) WITH RECURSIVE cte (n) AS ( SELECT 1 UNION ALL SELECT n + 1 FROM cte WHERE n < 1000000 -- 생성하고 싶은 더미 데이터의 개수 ) SELECT CONCAT('User', LPAD(n, 7, '0')), -- 'User' 다음에 7자리 숫자로 구성된 이름 생성 FLOOR(1 + RAND() * 1000) AS age -- 1부터 1000 사이의 난수로 나이 생성 FROM cte;
 
  1. 인덱스 생성
    1. CREATE INDEX idx_name ON users (name);
 
  1. 실행 계획 조회하기
    1. EXPLAIN SELECT * FROM users ORDER BY name LIMIT 10;
      notion image
      • type: index인걸로 봐서 풀 인덱스 스캔을 했다. 즉, 인덱스를 처음부터 끝까지 다 읽어서 필요한 데이터를 뽑아냈다.
       
  1. 실행 계획을 기반으로 SQL문이 어떤 순서로 데이터를 조회했을 지 생각해보기
    1. 출처 : 업무에 바로 쓰는 SQL 튜닝 (책)
      출처 : 업무에 바로 쓰는 SQL 튜닝 (책)
    2. name을 기준으로 정렬해서 데이터를 가져와야 하기 때문에, name을 기준으로 정렬되어 있는 인덱스를 조회한다. (덩치가 큰 users 테이블의 데이터를 하나씩 찾아보면서 정리를 하는 것보다, 이미 name을 기준으로 정렬되어 있는 인덱스를 참고하는 게 효율적이라고 판단한 것이다.)
    3. 모든 인덱스의 값을 다 불러온 뒤에 최상단 10개의 인덱스만 뽑아낸다.
    4. 10개의 인덱스에 해당하는 데이터를 users 테이블에서 조회한다.
 
 
 
author
category
MySQL
createdAt
series
비전공자도 이해할 수 있는 MySQL 성능 최적화 입문/실전 (SQL 튜닝편)
slug
type
series-footer
updatedAt
Jan 12, 2026 12:04 AM
📎
이 글은 비전공자도 이해할 수 있는 Docker 입문/실전 강의의 수업 자료 중 일부입니다.