본문 바로가기
CS/SQL

인덱스 설계 사고방식 1

by HWK 2026. 1. 6.

복합 인덱스 설계 사고방식

WHERE / ORDER BY / GROUP BY 실행 흐름 기준으로 이해하기

최근 GPT에게 “2025년 채팅 기록 기반으로 내가 좋아할 만한 CS 문제를 하나 내봐” 라고 프롬프팅해봤다.
그 결과로 나온 주제가 꽤 흥미로웠다.

복합 인덱스 진짜 쓰는 법
WHERE / ORDER BY / GROUP BY 실행 흐름 기준으로
인덱스 순서가 왜 중요한지 설명할 수 있는가?

아래는 그 문제를 실제 쿼리 기준으로 정리한 내용이다.

SELECT *
FROM HERGMT
WHERE COMPCD = ?   -- 회사코드
  AND PLCBUS = ?   -- 부서코드
  AND YEARXX = ?   -- 년도
ORDER BY DOCSEQ DESC
LIMIT 30;

이 쿼리를 빠르게 처리하기 위해 아래와 같은 인덱스를 설계했다고 가정하자.

(COMPCD, PLCBUS, YEARXX, DOCSEQ DESC)

이 인덱스가 왜 의미가 있는지, 그리고 순서를 바꾸면 왜 의미가 사라지는지를 설명할 수 있어야 한다.

 

2. 복합 인덱스가 실제로 정렬되는 방식

(COMPCD, PLCBUS, YEARXX, DOCSEQ DESC)  인덱스는 내부적으로 다음과 같이 정렬된다.

COMPCD
 └─ PLCBUS
     └─ YEARXX
         └─ DOCSEQ (DESC)

즉,

  • 회사코드가 같고
  • 부서코드가 같고
  • 년도가 같은 데이터끼리는
  • 문서번호 기준으로 이미 내림차순 정렬되어 있다

이 구조가 바로 성능의 핵심이다.

 

3. 인덱스 컬럼 순서의 의미

① COMPCD (회사코드)

  • 조건: COMPCD = ?
  • 대부분의 시스템에서 회사코드는 테넌트 기준
  • 전체 데이터에서 가장 큰 덩어리를 먼저 잘라냄

👉 가장 앞에 배치하는 것이 가장 효율적


② PLCBUS (부서코드)

  • 회사 내부에서 다시 한 번 강하게 필터링
  • = 조건

👉 WHERE 절의 동등 조건 → 앞쪽 유지


③ YEARXX (년도)

  • 역시 = 조건
  • 데이터 범위를 한 번 더 좁힘

👉 여기까지가 WHERE 절 전용 구간


④ DOCSEQ DESC (문서번호)

  • WHERE 조건에는 사용되지 않음
  • ORDER BY + LIMIT 전용 컬럼

👉 정렬용 컬럼은 항상 마지막

이 덕분에 DB는 추가 정렬(filesort) 없이,
인덱스를 타고 바로 30건만 읽고 종료할 수 있다.


4. 왜 문서번호를 앞에 두면 인덱스가 무의미해질까?

만약 인덱스를 이렇게 잡는다면?

(DOCSEQ, COMPCD, PLCBUS, YEARXX)

  • 인덱스는 문서번호 기준으로 먼저 정렬됨
  • 회사/부서/년도 조건은 인덱스 탐색에 제대로 사용되지 않음
  • 결국 넓은 범위를 스캔 + 조건 필터링

👉 사실상 인덱스를 안 쓴 것과 큰 차이가 없어짐


5. 핵심 요약 (LIST 쿼리 기준)

이 인덱스의 진짜 의미는 다음 한 문장으로 정리된다.

WHERE 절의 동등 조건 컬럼을 앞에 배치해
탐색 범위를 먼저 줄이고,
ORDER BY 컬럼을 뒤에 둬서 추가 정렬 없이 LIMIT을 처리한다.


6. GROUP BY가 섞이는 경우

이제 집계 쿼리를 보자.

SELECT PLCBUS, MAX(DOCSEQ)
FROM HERGMT
WHERE COMPCD = ?
  AND YEARXX = ?
GROUP BY PLCBUS
ORDER BY MAX(DOCSEQ) DESC;

 

이 경우 추천되는 인덱스는 다음과 같다.

(COMPCD, YEARXX, PLCBUS, DOCSEQ)

 

7. GROUP BY에서 인덱스 순서가 중요한 이유

GROUP BY는 DB 입장에서 정렬 문제다.

  • 인덱스로 미리 묶여 있지 않으면
  • DB는 무조건
    • 임시 테이블
    • filesort
      를 사용하게 된다

위 인덱스는 다음을 만족한다.

  • WHERE (COMPCD, YEARXX) → 범위 축소
  • GROUP BY (PLCBUS) → 인덱스 순서 그대로 그룹화 가능
  • DOCSEQ → MAX(DOCSEQ) 계산 시 보조 역할

8. ORDER BY는 왜 인덱스로 해결 못 하나?

ORDER BY MAX(DOCSEQ) DESC

이 정렬은 집계 결과에 대한 정렬이기 때문에
인덱스가 직접적으로 해결해주지는 못한다.

하지만 중요한 점은:

  • GROUP BY까지는 인덱스로 해결
  • 정렬 대상 데이터의 양 자체를 크게 줄일 수 있음

👉 결과적으로 전체 비용은 크게 감소한다.


9. 문서번호(DOCSEQ)를 인덱스에 포함하는 이유

  • 결과값에는 포함되지 않더라도
  • MAX(DOCSEQ) 계산 시
  • 각 그룹에서 최대값을 찾는 데 도움을 줌

특히:

  • 부서별 데이터가 많을수록
  • 체감 성능 차이가 커질 수 있다

10. 최종정리

👉 목적에 따라 인덱스 순서는 달라진다
👉 하지만 공통 원칙은 변하지 않는다.


한 문장 결론

복합 인덱스는 WHERE 문법 순서가 아니라
DB가 실제로 탐색·정렬·그룹화하는 흐름을 기준으로 설계해야 의미가 생긴다.

 

다음글

https://hwk99.tistory.com/215

 

인덱스 설계 사고방식 2 (GPT 추천 문제)

https://hwk99.tistory.com/214 인덱스 설계 사고방식 1 (GPT 추천 문제)복합 인덱스 설계 사고방식WHERE / ORDER BY / GROUP BY 실행 흐름 기준으로 이해하기최근 GPT에게 “2025년 채팅 기록 기반으로 내가 좋아할

hwk99.tistory.com

 

'CS > SQL' 카테고리의 다른 글

Index Merge  (0) 2026.01.06
Covering Index (커버링 인덱스)  (0) 2026.01.06
인덱스 설계 사고방식 2  (0) 2026.01.06
재귀 쿼리(Recursive Query)  (0) 2025.10.01
SQL 동적 쿼리(Dynamic SQL)  (0) 2025.10.01