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_컬럼명 형태로 짓는다. 복합 인덱스는 앞 컬럼부터 순서대로 사용될 때만 효율적이다.
⚠️ 인덱스 사용 시 주의사항
- 인덱스는 읽기 성능을 향상시키지만, 쓰기 성능은 저하시킬 수 있음
-. INSERT, UPDATE, DELETE 시 인덱스도 함께 갱신됨 - 불필요한 인덱스는 오히려 성능 저하
-. 너무 많은 인덱스는 부하만 증가 - 함수를 사용하는 조건에는 인덱스가 사용되지 않음
-- 인덱스 사용 ❌
WHERE UPPER(이름) = '홍길동'
-- 인덱스 사용 ⭕
WHERE 이름 = '홍길동'
📊 인덱스 확인 및 힌트
실행 계획 보기 (Oracle 예시)
EXPLAIN PLAN FOR
SELECT FROM 직원 WHERE 이름 = '홍길동';
실행 계획을 통해 인덱스가 사용되었는지, Full Table Scan이 발생했는지 확인 가능
힌트 사용 예시 (Oracle 기준)
SELECT /+ INDEX(직원 idx_이름) /
FROM 직원
WHERE 이름 = '홍길동';
📈 SQL 성능 향상 전략
인덱스 외에도 아래 전략들을 병행하면 SQL 성능을 극대화할 수 있습니다.
- WHERE 조건문 최적화
-. 불필요한 함수, LIKE 앞자리 와일드카드 지양 (LIKE '%abc' ❌) - SELECT 절에 필요한 컬럼만 조회
-. SELECT 은 성능 저하의 원인이 됨 - JOIN 순서 조정
-. 큰 테이블과 작은 테이블을 조인할 때, 작은 테이블을 먼저 읽도록 유도 - 서브쿼리 대신 조인 활용 (상황에 따라 다름)
-. 특히 서브쿼리가 반복 실행되면 성능 저하 심함 - 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 시험은 물론이고, 실무에서 대용량 데이터를 다룰 때도 이 개념을 제대로 이해하지 못하면 심각한 병목 현상을 겪을 수 있어요.
'프로그래밍' 카테고리의 다른 글
실무 SQL 튜닝 기법 완벽 정리 (3) | 2025.08.07 |
---|---|
트랜잭션과 병행 제어: 데이터베이스의 신뢰성을 지키는 핵심 원리 (3) | 2025.08.06 |
서브쿼리와 인라인 뷰 – SQLD 필수 개념 정리 (2) | 2025.08.05 |
GROUP 함수와 집계 처리 – SQLD 완벽 정리 (2) | 2025.08.05 |
JOIN의 모든 것 – 관계형 데이터베이스의 핵심 연결 기술 (2) | 2025.08.04 |