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;
요약하면, EXPLAIN
의 type
컬럼은 MySQL이 데이터에 어떻게 접근하는지를 나타냅니다. 가능한 ALL
접근 방식은 피하고, CONST
, EQ_REF
, REF
와 같은 방식을 사용하도록 쿼리를 최적화하는 것이 좋습니다.
728x90
'데이터베이스' 카테고리의 다른 글
[트랜잭션 시리즈 - 1] 트랜잭션의 격리 수준 정리 (0) | 2025.03.24 |
---|---|
재귀적 쿼리에 대한 이해 (1) | 2023.09.20 |
MySQL `EXPLAIN`의 이해와 활용 (0) | 2023.09.12 |
복합키란 무엇인가? (1) | 2023.09.06 |
ERD 설계의 중요성과 핵심 요소 (0) | 2023.09.05 |