본문 바로가기
데이터베이스

MySQL `EXPLAIN`의 조인 타입(`type` 컬럼) 깊게 이해하기

by 시니성 2023. 9. 12.

MySQL 쿼리의 실행 계획에서 type 컬럼은 해당 쿼리의 레코드에 어떻게 접근할지를 나타내는 중요한 지표입니다. 이 값이 어떻게 되느냐에 따라 쿼리의 성능이 크게 달라질 수 있습니다.

1. ALL (Full Table Scan)

  • 설명: 테이블의 모든 행을 스캔하는 방식. 이 방식은 가능한 피해야 합니다, 왜냐하면 대부분의 경우에 있어 매우 비효율적이기 때문입니다.
  • 예시 시나리오:
      -- 아무런 조건이 없는 조회 쿼리
      SELECT * FROM users;

2. INDEX

  • 설명: 전체 인덱스를 스캔하는 방식. ALL보다는 낫지만, 여전히 비효율적일 수 있습니다.
  • 예시 시나리오:
      -- 인덱스만을 스캔하는 쿼리
      SELECT user_id FROM orders;

3. RANGE

  • 설명: 인덱스를 사용하여 특정 범위의 행을 선택하는 방식.
  • 예시 시나리오:
      -- 나이가 특정 범위 내에 있는 사용자 조회
      SELECT * FROM users WHERE age BETWEEN 20 AND 30;

4. REF

  • 설명: 인덱스를 사용하여 하나 또는 그 이상의 행에 접근하는 방식.
  • 예시 시나리오:
      -- 특정 국가의 사용자 조회 (country가 non-unique 인덱스인 경우)
      SELECT * FROM users WHERE country = 'South Korea';

5. EQ_REF

  • 설명: 다른 테이블과 조인할 때, 조인 조건에서 사용된 모든 키가 Primary Key 또는 Unique 인덱스인 경우.
  • 예시 시나리오:
      -- 주문과 사용자를 조인하여 특정 사용자의 주문 조회
      SELECT o.* FROM orders o
      JOIN users u ON o.user_id = u.id
      WHERE u.name = 'John Doe';

6. CONST

  • 설명: Primary Key 또는 Unique 인덱스를 사용하여 하나의 행만을 조회하는 경우.
  • 예시 시나리오:
      -- id가 Primary Key인 경우, 특정 id의 사용자 조회
      SELECT * FROM users WHERE id = 5;

7. NULL

  • 설명: 아무런 행에도 접근할 필요가 없는 경우 사용됩니다. 예를 들어, 조인된 테이블에서 필요한 데이터가 없는 경우 등에 사용됩니다.
  • 예시 시나리오:
      -- 아무런 결과를 가져오지 않는 경우
      SELECT * FROM users WHERE 1=0;

요약하면, EXPLAINtype 컬럼은 MySQL이 데이터에 어떻게 접근하는지를 나타냅니다. 가능한 ALL 접근 방식은 피하고, CONST, EQ_REF, REF와 같은 방식을 사용하도록 쿼리를 최적화하는 것이 좋습니다.

'데이터베이스' 카테고리의 다른 글

재귀적 쿼리에 대한 이해  (1) 2023.09.20
MySQL `EXPLAIN`의 이해와 활용  (0) 2023.09.12
복합키란 무엇인가?  (0) 2023.09.06
ERD 설계의 중요성과 핵심 요소  (0) 2023.09.05
정규화와 정규형  (0) 2023.07.25