본문 바로가기
프로그래밍

인덱스와 성능 향상 전략 – SQLD 필수 개념 정리

by 유형제맘 2025. 8. 5.

SQL에서 데이터를 빠르게 조회하는 것은 매우 중요합니다. 아무리 정확한 쿼리를 작성하더라도, 성능이 느리면 실무에서 활용할 수 없습니다. 이번 시간에는 SQL의 성능을 향상시키는 핵심 요소인 인덱스(Index)와 함께, 다양한 성능 향상 전략을 정리해보겠습니다.

인덱스(Index)란?

인덱스(Index)는 책의 목차처럼, 데이터를 빠르게 찾기 위한 자료 구조입니다. DBMS는 인덱스를 사용해서 특정 데이터를 더 효율적으로 검색할 수 있습니다.

 

인덱스를 사용하지 않은 경우

  • 데이터가 저장된 전체 테이블을 처음부터 끝까지 스캔 → Full Table Scan
  • 데이터량이 많을수록 성능 저하가 심각해짐

인덱스를 사용한 경우

  • 필요한 값을 가진 레코드를 빠르게 검색
  • 수십만, 수백만 건의 데이터에서도 속도 차이가 매우 큼

📌 인덱스의 구조

대부분의 RDBMS는 B-tree (Balanced Tree) 구조의 인덱스를 사용합니다.

  • 균형잡힌 트리 형태로 구성되어 탐색이 빠름 (O(log n) 성능)
  • 루트 → 중간 노드 → 리프 노드로 이동하면서 원하는 데이터를 탐색

🛠️ 인덱스의 종류

종류 설명
기본 인덱스 단일 컬럼에 생성되는 일반 인덱스
복합 인덱스 두 개 이상의 컬럼을 묶어서 만든 인덱스
유니크 인덱스 값의 중복을 허용하지 않음 (ex. 주민번호, 사번 등)
클러스터드 인덱스 데이터의 실제 저장 순서를 정렬하는 인덱스 (MySQL InnoDB 등)
비트맵 인덱스 값의 종류가 적은 경우 사용 (예: 성별, 지역코드)

🧱 인덱스 생성 예제

CREATE INDEX idx_이름 ON 직원(이름);
CREATE INDEX idx_부서_직책 ON 직원(부서번호, 직책);

인덱스 이름은 보통 idx_컬럼명 형태로 짓는다. 복합 인덱스는 앞 컬럼부터 순서대로 사용될 때만 효율적이다.

⚠️ 인덱스 사용 시 주의사항

  1. 인덱스는 읽기 성능을 향상시키지만, 쓰기 성능은 저하시킬 수 있음
    -. INSERT, UPDATE, DELETE 시 인덱스도 함께 갱신됨
  2. 불필요한 인덱스는 오히려 성능 저하
    -. 너무 많은 인덱스는 부하만 증가
  3. 함수를 사용하는 조건에는 인덱스가 사용되지 않음
-- 인덱스 사용 ❌
WHERE UPPER(이름) = '홍길동'

-- 인덱스 사용 ⭕
WHERE 이름 = '홍길동'

📊 인덱스 확인 및 힌트

실행 계획 보기 (Oracle 예시)

EXPLAIN PLAN FOR
SELECT  FROM 직원 WHERE 이름 = '홍길동';

실행 계획을 통해 인덱스가 사용되었는지, Full Table Scan이 발생했는지 확인 가능

힌트 사용 예시 (Oracle 기준)

SELECT /+ INDEX(직원 idx_이름) /  
FROM 직원 
WHERE 이름 = '홍길동';

📈 SQL 성능 향상 전략

인덱스 외에도 아래 전략들을 병행하면 SQL 성능을 극대화할 수 있습니다.

  1. WHERE 조건문 최적화
    -. 불필요한 함수, LIKE 앞자리 와일드카드 지양 (LIKE '%abc' ❌)
  2. SELECT 절에 필요한 컬럼만 조회
    -. SELECT 은 성능 저하의 원인이 됨
  3. JOIN 순서 조정
    -. 큰 테이블과 작은 테이블을 조인할 때, 작은 테이블을 먼저 읽도록 유도
  4. 서브쿼리 대신 조인 활용 (상황에 따라 다름)
    -. 특히 서브쿼리가 반복 실행되면 성능 저하 심함
  5. LIMIT / ROWNUM 사용으로 불필요한 데이터 줄이기
    -. 페이지네이션 처리 시 유용

🧠 실전 예제 비교

성능 나쁜 쿼리

SELECT  
FROM 직원
WHERE TO_CHAR(입사일, 'YYYY') = '2020';

 

성능 좋은 쿼리

SELECT  
FROM 직원
WHERE 입사일 BETWEEN TO_DATE('2020-01-01', 'YYYY-MM-DD')
               AND TO_DATE('2020-12-31', 'YYYY-MM-DD');

함수 없이 비교 가능한 조건으로 작성하면 인덱스 활용 가능성이 높아짐

📝 요약

전략 핵심 요약
인덱스 사용 빠른 조회, 느린 쓰기
인덱스 구조 B-tree 기반
조건절 최적화 함수 피하고 직접 비교
SELECT 컬럼 최소화 필요한 컬럼만 선택
실행 계획 분석 인덱스 사용 여부 확인
LIKE 와일드카드 주의 "%abc"보단 "abc%" 형태로 사용

인덱스와 성능 향상 전략은 SQL을 빠르게 실행하는 데 필수적인 개념입니다. SQLD 시험은 물론이고, 실무에서 대용량 데이터를 다룰 때도 이 개념을 제대로 이해하지 못하면 심각한 병목 현상을 겪을 수 있어요.