SQL

[DB Optimization#7] 멀티 컬럼 인덱스(Multiple-Column Index)란?

j.d 2025. 4. 17. 02:38

멀티 컬럼 인덱스란?

멀티 컬럼 인덱스란, 2개 이상의 컬럼을 묶어서 만든 인덱스를 말합니다.
즉, 단일 컬럼이 아니라 두 개 이상의 컬럼을 기준으로 정렬된 탐색용 자료구조라고 이해하면 됩니다.

보다 직관적으로 표현하자면,

여러 컬럼을 기준으로 데이터를 미리 정렬해놓은 표가 멀티 컬럼 인덱스입니다.

 

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    이름 VARCHAR(100),
    부서 VARCHAR(100),
    나이 INT
);

INSERT INTO users (이름, 부서, 나이) VALUES
('박미나', '회계', 26),
('김미현', '회계', 23),
('김민재', '회계', 21),
('이재현', '운영', 24),
('조민규', '운영', 23),
('하재원', '인사', 22),
('최지우', '인사', 22);
CREATE INDEX idx_부서_이름 ON users (부서, 이름);

 

여기서 부서, 이름 컬럼을 묶어서 멀티 컬럼 인덱스를 생성하면
내부적으로는 부서 기준 정렬 → 같은 부서 내에서는 이름 기준 정렬이 적용된 표가 만들어집니다.

즉, 아래와 같은 형태로 정렬됩니다:

 

부서 이름
운영 이재현
운영 조민규
인사 하재원
인사 최지우
회계 김미현
회계 김민재
회계 박미나

 

 

멀티 컬럼 인덱스가 실제로 어떻게 활용되는가?

다음 SQL을 실행한다고 가정해보겠습니다.

SELECT * 
FROM users
WHERE 부서 = '인사'
ORDER BY 이름;
  • 인덱스를 (부서, 이름) 순으로 만들어놨기 때문에,
    • 부서 = '인사' 조건으로 먼저 빠르게 필터링되고,
    • 같은 부서 내에서 이름 기준으로 이미 정렬된 상태로 조회됩니다.

정렬 작업이 생략되기 때문에 속도가 빠름

 

※ 주의 사항

1. 앞쪽 컬럼은 단독으로도 인덱스로 활용 가능.

(부서, 이름)으로 만든 인덱스는 부서 기준 정렬이 되어 있으므로, 아래와 같은 쿼리에서도 인덱스를 활용할 수 있습니다.

SELECT * 
FROM users 
WHERE 부서 = '운영';

→ 이 경우 부서 단독 인덱스와 같은 효과를 냅니다.
→ 별도로 부서 인덱스를 추가할 필요는 없습니다.

 

2. 뒤쪽 컬럼은 단독으로 활용할 수 없다.

다음 쿼리는 인덱스를 활용하지 못합니다.

SELECT * 
FROM users 
WHERE 이름 = '이재현';

왜냐하면, (부서, 이름) 인덱스는 부서가 동일한 데이터 내에서만 이름을 정렬해두기 때문입니다.
즉, 이름 전체를 기준으로 정렬된 인덱스는 존재하지 않기 때문에 효율적인 탐색이 어렵습니다.

멀티 컬럼 인덱스는 앞에서부터 순서대로만 인덱스처럼 작동합니다.

 

 

3. 컬럼 순서에 따라 성능이 크게 달라진다.

멀티 컬럼 인덱스의 컬럼 순서를 잘못 정하면 성능 향상을 기대하기 어렵습니다.

예를 들어 ‘회계 부서의 박미나’를 찾는 쿼리가 많다면

  • (부서, 이름) 보다
  • (이름, 부서) 순으로 인덱스를 구성하는 것이 더 빠를 수 있습니다.

이처럼 보통은 중복도가 낮은 컬럼(선택도(cardinality)가 높은 컬럼)을 앞에 배치하는 것이 좋습니다.

예: 이름은 유일한 경우가 많지만, 부서는 중복이 많음
→ 이름 → 부서 순으로 인덱싱하는 것이 더 유리